【问题标题】:How to convert microsecond timestamp to datetime?在 Python 中将微秒时间戳转换为日期时间
【发布时间】:2012-09-17 09:12:43
【问题描述】:

我正在从 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

但是,这会产生错误的日​​期(大约相差一年)。我在这里做错了什么?

【问题讨论】:

  • 你能举一个纪元时间戳和对应的预期日期时间吗?
  • 另外,10000000.0 是一微秒,对吧?
  • 13022344559000000 - 2013 年 8 月 30 日上午 06:55
  • 是的,我相信它是微秒。很抱歉造成混乱。

标签: python datetime timestamp


【解决方案1】:

另一种选择,从 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'

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

更新:

正如@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'

【讨论】:

  • 正确的年份是 2013 年。为什么一年减一?
  • 因为他基于 1600 而不是 1601。
  • 你是对的。修复了示例以具有正确的基于 1601 的纪元。
  • pytz 在这种情况下是不必要的。只需对原始日期时间对象进行操作,就好像它们在 UTC 中一样。
【解决方案2】:

我不确定您从什么数据开始,但这里是一个从整数时间戳开始的示例。假设存在 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 天。

为什么是这样的天数?闰年!我们增加了一定的天数,而不是年数。 (实际上,adding years is not directly supportedtimedelta 对象中。)

【讨论】:

  • 这行得通,但我认为 Pedro Romano 的解决方案,只是用 1600-01-01 时期计算,而不是静态地计算出 134774 天的偏移量并用它来计算,更好(除非它在某种程度上是需要运行数百万次的脚本的性能问题……)。
  • 在性能方面应该差不多。按照他的方式,您可以根据 1970 年计算 1601 年的日期,然后添加您的时间偏移量。这样,您将时间偏移量视为 1970 年,然后减去历元之间的差异。
猜你喜欢
  • 2020-10-20
  • 2019-02-03
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2011-04-14
  • 2020-06-15
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多