3

我有一本来自数据库的字典,我知道 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

但是当我在笔记本电脑上本地运行它时,我得到(本地我在 PST)

>>(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())

更具体地说,为什么使用strftime 将 python 日期时间转换为纪元

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

给出不同的值?

4

1 回答 1

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 时间。

于 2013-07-19T04:48:16.463 回答