2012-12-21 111 views
0

我无法将日期时间转换为UTC中的时间戳。如何将太平洋时区的日期时间转换为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月19日@ 6:00:美国东部时间下午5点,这意味着时间戳是建立在假设UTC时区而不是PST的基础上的。

我在这里做什么来获得时间戳以尊重日期时间的时区?

回答

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 
+0

这只是工作的例子,我的化险为夷,非常感谢 –

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 
相关问题