时区的问题所有时区都是本地时区?

2024-06-16 09:41:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中遇到时区问题,有个奇怪的例子。。。 我使用的是python2.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

我原以为这三个例子(UTC、EST、MST)应该是0.0、5.0和7.0,但是这三种情况我都得到了5.0(我的计算机在EST中运行)。在

另外

^{pr2}$

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

所以,如果我在MST中从一个客户那里接收到数据,并想用UTC生成一个历元,我必须假装时间戳在EST中,然后加上5个小时吗?在

这是不是因为strptime丢弃了时区信息?在


Tags: importdatetimetime时间例子estutcprint
1条回答
网友
1楼 · 发布于 2024-06-16 09:41:15

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

>>> 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 and pytz give different results。改为使用localize(),让pytz有机会根据任何适用的时区规则来按摩数据。在

以下代码将从MST转换为EST:

^{pr2}$

我不知道这能不能处理所有的案子。例如,你经常会看到一些奇怪的事情发生在夏时制的过渡时期。如果遇到问题,请开始搜索第三方时间库。在

相关问题 更多 >