为什么我在不同机器上的python中获得不同的时间戳

时间:2013-07-19 00:31:17

标签: python datetime timestamp

我有一个来自数据库的字典,我知道create_dt和install_ts匹配。

untimed = {'install_id': 399142,  'create_dt': datetime.datetime(2013, 7, 7, 0, 33, 2), 'install_ts': 1373157182}

在QA上运行以下代码时,一切都是正确的

>>(mktime(untimed['create_dt'].timetuple()) - untimed['install_ts']) / 3600
0.0

但是当我在笔记本电脑上本地运行时,我得到(本地我在太平洋标准时间)

>>(mktime(untimed['create_dt'].timetuple()) - untimed['install_ts']) / 3600
7.0

为什么我没有获得相同的时间戳?我知道create_dt是UTC,但在本地它强制它到PST(-700)。

注意:我已将问题缩小到这个范围,但完整的问题是我在尝试时收到了错误的时间戳

mktime(datetime.strptime(install['click_date'],'%Y-%m-%d %H:%M:%S').timetuple())

更具体地说,Convert python datetime to epoch with strftime中的原因

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')  # This is equivalent to my issues above
'1333234800'
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0

给出不同的价值观?

1 个答案:

答案 0 :(得分:3)

unix时间戳是时间点和时间之间的偏移值,它与时区无关。当它转换为人类可读的字符串,如'%Y-%m-%d%H:%M:%S',不包含任何时区信息时,python假定您要使用本地时区设置。

当你运行这个

datetime.strptime(install['click_date'],'%Y-%m-%d %H:%M:%S')

你得到一个datetime对象,它不包含任何时区信息,只能解释为本地时间。如果在UTC服务器上运行该对象,则该对象将被解释为“2013-07-07 00:33:02 UTC”,如果在PST服务器上它是“2013-07-07 00:33:02 PST”,则它们是因此,它们具有不同的unix时间戳值。要将install ['click_date']视为UTC时间,需要添加时区偏移量:

time.mktime(datetime.datetime.strptime(install['click_date'], '%Y-%m-%d %H:%M:%S %Z').timetuple()) + time.timezone

在我的CST服务器上(时区0800),

>>> time.mktime(datetime.datetime.strptime('2013-07-07 00:33:02', '%Y-%m-%d %H:%M:%S').timetuple()) 

1373128382.0

>>> time.mktime(datetime.datetime.strptime('2013-07-07 00:33:02', '%Y-%m-%d %H:%M:%S').timetuple()) + time.timezone

1373099582.0

第一次通话以“2013-07-07 00:33:02”为本地时间,第二次以UTC时间为准。