我无法将日期时间转换为UTC时间戳。
TS_FMT = '%Y-%m-%d %H:%M:%S'
t = time.strptime('2012-11-20 00:00:00', TS_FMT)
dt = datetime.datetime(t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min,
t.tm_sec, tzinfo=pytz.timezone('America/Los_Angeles'))
此时,dt处于“正确”状态:
datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
但是这样做:
>>> time.mktime(dt.timetuple())
1353369600.0
这是美国东部时间11/19/12 @ 6:00:00 pm,这意味着时间戳是在假定UTC时区而非PST的情况下构建的。
我该怎么做以获得时间戳以尊重日期时间的时区?
答案 0 :(得分:2)
from datetime import datetime
import pytz
import calendar
calendar.timegm(pytz.timezone('America/Los_Angeles').localize(datetime.strptime('2012-11-20 00:00:00', '%Y-%m-%d %H:%M:%S')).utctimetuple())
返回
1353398400
答案 1 :(得分:0)
time.mktime与系统本地时间相关,而不是UTC。您可以通过将时期计算为两个时区感知日期时间对象之间的时差来获取正确的值。来自http://docs.python.org/2/library/datetime.html:
有两种日期和时间对象:“天真”和“意识”。
知觉对象充分了解适用的算法和政治时间调整,例如时区和夏令时信息,以便相对于其他知晓对象定位自己。知觉对象用于表示不对解释[1]开放的特定时刻。
一个天真的对象没有足够的信息来明确地相对于其他日期/时间对象定位自己。天真物体是代表协调世界时(UTC),当地时间还是其他某个时区的时间完全取决于程序,就像程序一样,特定数字是代表米,英里还是质量。天真的物体易于理解和使用,代价是忽略了现实的某些方面。
通过尝试以下
来举例说明>>> dt
datetime.datetime(2012, 11, 20, 0, 0, tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)
>>> dt - datetime.datetime(1970, 1, 1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't subtract offset-naive and offset-aware datetimes
>>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('America/Los_Angeles'))).total_seconds()
1353369600.0
>>> (dt - datetime.datetime(1970, 1, 1, tzinfo=pytz.timezone('UTC'))).total_seconds()
1353398400.0