0

我无法将日期时间转换为 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:00pm EST,这意味着时间戳是在假设 UTC 时区而不是 PST 的情况下构建的。

我该怎么做才能让时间戳尊重日期时间的时区?

4

2 回答 2

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
于 2012-12-21T11:01:12.243 回答
0

time.mktime相对于系统本地时间,而不是 UTC。您可以通过将纪元计算为两个时区感知日期时间对象之间的时间差来获得正确的值。来自http://docs.python.org/2/library/datetime.html

有两种日期和时间对象:“naive”和“aware”。

感知对象对适用的算法和政治时间调整(例如时区和夏令时信息)有足够的了解,以相对于其他感知对象定位自身。感知对象用于表示不可解释的特定时刻 [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
于 2012-12-21T11:35:36.843 回答