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

在Python中将微秒时间戳转换为日期时间,python,datetime,timestamp,Python,Datetime,Timestamp,我从Google Chrome中提取了一个cookie过期日期。从外观上看,Chrome使用时间戳存储cookie过期,时间戳使用UTC 1601-01-01 00:00:00作为历元。我目前的执行情况如下: stamp = int(result[3]) date = datetime.datetime.fromtimestamp(stamp / 10000000.0) print date.year 然而,这产生了错误的日期(大约相隔一年)。我在这里做错了什么?我不确定您从什么数据开始,但这

我从Google Chrome中提取了一个cookie过期日期。从外观上看,Chrome使用时间戳存储cookie过期,时间戳使用UTC 1601-01-01 00:00:00作为历元。我目前的执行情况如下:

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

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

我不确定您从什么数据开始,但这里有一个从整数时间戳开始的示例。假设存在
pytz
模块(我强烈推荐)

好了。1601年1月1日纪元和1970年1月1日纪元之间的转换为134774天


为什么有那么多天?闰年!我们增加了一定数量的天数,而不是年份。(事实上,在
timedelta
对象中。)

另一个选项,从Python 3.2以来的标准库中获取
tzinfo
(对于较旧的Python版本,您可以从以下位置获取):

我假设与预期值的差值是时区偏移量

更新:

正如@J.F.Sebastian正确指出的那样,如果您使用隐式UTC naive
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'

你能给出一个历元时间戳和相应的预期日期时间的例子吗?另外,
10000000.0
表示一微秒的时间吗?1302234455900000-2013年8月30日06:55 AMYes,我相信是微秒。很抱歉造成混淆。这是可行的,但我认为Pedro Romano的解决方案,只使用1600-01-01历元计算,而不是静态计算134774天的偏移量并使用它进行计算,会更好(除非对于需要运行数百万次的脚本来说,这是一个性能问题或其他问题……)。在性能方面应大致相同。按照他的方法,你计算1601年的日期和1970年的时间,然后加上你的时间偏移量。通过这种方式,你可以将时间偏移量与1970年相比,然后减去各时代之间的差异。正确的年份是2013年。为什么这一年会减少一年?因为他是基于1600年而不是1601年。你说得对。修复了示例中基于1601的正确纪元。
pytz
在这种情况下是不必要的。只需操作简单的datetime对象,就好像它们在UTC中一样。
>>> 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'
>>> 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'