【发布时间】:2013-10-10 06:55:44
【问题描述】:
我的目的只是输出一个时区字符串,如电子邮件中使用的 -0700。具体来说,我希望它反映确切的时区,包括夏令时。这意味着我会在夏天在加利福尼亚得到 -0700,冬天在加利福尼亚得到 -0800,在中国总是得到 +0800(没有夏令时)。
我觉得很难有两个原因:
- 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}
谁有更好的实现?
【问题讨论】:
-
使用 datetime 和 pytz pytz.sourceforge.net
-
@monkut:对于只是当前机器时区偏移量,这是矫枉过正。
-
@Martjin:我想我在测试
struct_time时犯了一个错误。这实际上是我现在建议的解决方案。 -
谢谢,我不知道
time知道夏令时。
标签: python timezone timezone-offset