我正在从 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
但是,这会产生错误的日期(大约一年)。我在这里做错了什么?
另一种选择,tzinfo
从 Python 3.2 以来的标准库中获取(对于较旧的 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'
我不确定您从什么数据开始,但这里是一个从整数时间戳开始的示例。假设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
。)