时区的麻烦——所有的时区都是本地时区



我在python的时区有麻烦,有一个奇怪的例子…我正在使用Python 2.7.2

import time
import datetime
import pytz
utc = pytz.utc
est = pytz.timezone('US/Eastern')
mst = pytz.timezone('US/Mountain')
print 'UTC time',time.mktime(datetime.datetime(1970, 01, 01, 0, 0, 0, tzinfo=utc).timetuple())/3600
print 'EST time',time.mktime(datetime.datetime(1970, 01, 01, 0, 0, 0, tzinfo=est).timetuple())/3600
print 'MST time',time.mktime(datetime.datetime(1970, 01, 01, 0, 0, 0, tzinfo=mst).timetuple())/3600

我认为我应该得到0.0,5.0和7.0的三个例子(UTC,EST,MST) -然而我得到5.0所有三种情况(我的计算机在EST运行)。

另外

time.mktime(time.gmtime(0))

返回18000.0(5小时)-因此-显式地请求元组的gmtime,然后转换为epoch返回5小时。我的python发行版有time.time()和time.gmtime(),但没有time.timegm()

所以,如果我从MST的客户那里收到数据-并且想要在UTC中生成一个纪元-我必须假装时间戳在EST中然后添加五个小时吗?

这是strptime丢弃时区信息的结果吗?

timetuple()(和所有其他基于struct-tm的函数)丢弃时区信息;也就是说,时间元组数据结构根本没有时区字段。它的目的是将日期时间分解为其组件显示字段,因此它从未真正设计用于计算时间值。尽量保持datetime格式的值

>>> datetime.datetime(1970, 01, 01, 0, 0, 0, tzinfo=utc)
datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)
>>> datetime.datetime(1970, 01, 01, 0, 0, 0, tzinfo=utc).timetuple()
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

另外,您不应该仅仅将tzinfo直接插入datetime构造函数中——它并不总是给出正确的结果,根据这个答案:dateutil和pytz给出不同的结果。使用localalize()代替,让pytz有机会根据任何适用的时区规则对数据进行分组。

下面的代码将从MST转换为EST:

>>> now = mst.localize(datetime.datetime(1970, 01, 01, 0, 0, 0))
>>> now
datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Mountain' MST-1 day, 17:00:00 STD>)
>>> now.astimezone(est)
datetime.datetime(1970, 1, 1, 2, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)

我不知道这是否处理了所有的极端情况。例如,你经常会看到在夏令时过渡期间发生奇怪的事情。如果遇到问题,请开始搜索第三方时间库。

相关内容

  • 没有找到相关文章

最新更新