在Python中将微秒时间戳转换为datetime

时间:2012-09-25 19:41:21

标签: python datetime timestamp

我正在从Google Chrome中提取Cookie到期日期。从它的外观来看,Chrome正在使用时间戳存储Cookie过期,该时间戳使用1601-01-01 00:00:00 UTC作为纪元。我目前的实施如下:

stamp = int(result[3])
date = datetime.datetime.fromtimestamp(stamp / 10000000.0)
print date.year

然而,这产生错误的日​​期(约一年)。我在这里做错了什么?

2 个答案:

答案 0 :(得分:8)

另一个选择,从Python 3.2开始从标准库中获取tzinfo(对于较早的Python版本,如果来自pytz则可以获得):

>>> import pytz
>>> from datetime import datetime, timedelta, timezone
>>> epoch = datetime(1601, 1, 1, tzinfo=timezone.utc)
>>> cookie_microseconds_since_epoch = 13022344559000000
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch)
>>> str(cookie_datetime)
'2013-08-29 13:55:59+00:00'

我认为与预期值的差异是时区偏移。

<强>更新

正如@JFSebastian正确指出的那样,如果您使用隐式UTC 天真 datetime对象,tzinfo是多余的,上面的内容可以简化为:

>>> from datetime import datetime, timedelta
>>> epoch = datetime(1601, 1, 1)
>>> cookie_microseconds_since_epoch = 13022344559000000
>>> cookie_datetime = epoch + timedelta(microseconds=cookie_microseconds_since_epoch)
>>> str(cookie_datetime)
'2013-08-30 13:55:59'

答案 1 :(得分:1)

我不确定您开始使用的数据,但这里是一个从整数时间戳开始的示例。假设pytz模块存在(我高度推荐)。

>>> import datetime, pytz
>>> x = datetime.datetime.fromtimestamp(0)
>>> x = x.replace(tzinfo=pytz.UTC)
>>> str(x)
'1970-01-01 00:00:00+00:00'
>>> d = datetime.timedelta(365 * (1970 - 1601))
>>> str(x - d)
'1601-03-31 00:00:00+00:00'
>>> d = datetime.timedelta(365 * (1970 - 1601) + 31 + 28 + 31 - 1)
>>> str(x - d)
'1601-01-01 00:00:00+00:00'
>>> str(d)
'134774 days, 0:00:00'

所以你有它。 1601年1月1日和1970年1月1日之间的转换是134774天。

为什么这么多天?闰年!我们增加了一定天数,而不是几年。 (事实上​​,timedelta对象中的adding years is not directly supported。)