Моя цель - просто вывести строку часового пояса, например -0700, используемую в электронной почте. В частности, я хочу, чтобы он отражал точный часовой пояс, включая переход на летнее время. Это означает, что я получу -07:00 в Калифорнии летом, -08:00 в Калифорнии зимой и всегда +08:00 в Китае (без перехода на летнее время).
Мне трудно по двум причинам:
- Целочисленное деление Python, в отличие от C99 и обычных реализаций C/C++, всегда округляется до нуля, а не до нуля. (Это имеет значение для расчетов с часовым поясом, например -xx30).
- struct_time.tm_isdst и time.daylight не отражают, действует ли переход на летнее время.
В итоге я получил код, подобный следующему. Это длиннее, чем я ожидал (особенно для Python!):
import math
import time
def my_divide(dividend, divisor):
if dividend < 0:
if divisor < 0:
diff_sign = False
else:
diff_sign = True
else:
if divisor >= 0:
diff_sign = False
else:
diff_sign = True
if diff_sign:
return (int(math.ceil(1.0 * dividend / divisor)), dividend % -divisor)
else:
return (int(math.floor(1.0 * dividend / divisor)), dividend % divisor)
def my_timezone():
gt = time.gmtime()
lt = time.localtime()
lt_write = list(lt)
lt_write[8] = 0 # is_dst
lt = time.struct_time(lt_write)
seconds = time.mktime(lt) - time.mktime(gt)
(hours, minutes) = my_divide(seconds, 3600)
minutes = abs(minutes) // 60
return '%(hours)+03d%(minutes)02d' % {'hours': hours, 'minutes': minutes}
У кого-нибудь есть лучшая реализация?
struct_time
. На самом деле это решение, которое я предлагаю сейчас. - person Yongwei Wu   schedule 10.10.2013time
знал о dst. - person monkut   schedule 11.10.2013