我在将日期时间转换为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
这是美国东部时间12月11日下午6:00:00,这意味着时间戳是在假定UTC时区而不是PST的情况下构建的。
我在这里该怎么做才能使时间戳与日期时间的时区相一致?
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
time.mktime是相对于系统本地时间,而不是UTC。您可以通过将epoch计算为两个时区感知日期时间对象之间的时间差来获得正确的值。从…起http://docs.python.org/2/library/datetime.html:
日期和时间对象有两种:"天真"one_answers"意识"。
意识对象对适用的算法和政治时间调整(如时区和夏令时信息(有足够的知识,可以相对于其他意识对象定位自己。感知对象用于表示不可解释的特定时刻[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