我的目的只是输出一个时区字符串,如电子邮件中使用的-0700。具体来说,我想要它反映确切的时区,包括夏令时。这意味着我将在夏季在加利福尼亚州获得-0700,在冬季在加利福尼亚州获得-0800,在中国总是+0800(无夏令时)。
我发现很难有两个原因:
我最终得到了如下代码。它比我预期的要长(尤其是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}
有没有更好的实施?
答案 0 :(得分:2)
您可以使用time.timezone
和time.altzone
值。
这些提供:
本地(非DST)时区的偏移量,以UTC为单位的西秒(西欧大部分地区为负,美国为零,英国为零)
和
本地DST时区的偏移量,以UTC为单位的秒数(如果已定义)。如果当地DST时区在UTC以东(如在西欧,包括英国),则这是否定的。仅在
daylight
非零时才使用此项。
正如time.altzone
的文档所解释的那样,当time.daylight
非零时使用后者,但仅当当前时间是夏令时时才使用后者:
import time
def my_timezone():
is_dst = time.daylight and time.localtime().tm_isdst
offset = time.altzone if is_dst else time.timezone
westerly = offset > 0
minutes, seconds = divmod(abs(offset), 60)
hours, minutes = divmod(minutes, 60)
return '{}{:02d}{:02d}'.format('-' if westerly else '+', hours, minutes)
以秒为基础,divmod()
此处不应存在舍入错误。
对于我在英国的夏季地点,这给出了:
>>> my_timezone()
'+0100'