Python 日期时间到纪元

新手上路,请多包涵
t='20180515102500'
d=datetime.strptime(t, "%Y%m%d%H%M%S")
millis_since_epoch = int(time.mktime(d.timetuple())) * 1000
print(millis_since_epoch)

给我:repl.it(python 3.6.1)上的 15263 799 00000 和我本地的:15263 979 00000(python 2.7.14)

为什么?将日期时间对象转换为纪元的推荐方法是什么?

原文由 user1179299 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 405
2 个回答

尝试这个:

 t='20180515102500'
d=datetime.datetime.strptime(t, "%Y%m%d%H%M%S")
print(d)
epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
  return (dt - epoch).total_seconds() * 1000

unix_time_millis(d)

让我知道是否有帮助!

原文由 IAmGroot 发布,翻译遵循 CC BY-SA 4.0 许可协议

你的问题是你使用的是天真的 datetime (和 struct_tm 等等)对象。所以你问的是“无论这台机器上的本地时区是什么”中的 15 May 2018 10:25:00 距离 Unix 纪元有多远。如果您在时区相隔 5 小时的两台机器上运行它,您将得到相隔 5*3600*1000 毫秒的结果。

推荐的方法是:

 d.timestamp() # returns difference from epoch as float seconds

… 或者:

 d - datetime.fromtimestamp(0) # returns difference as timedelta

(很明显如何将它们中的任何一个转换为 float millis 或您需要的任何其他内容。)

但这些都不会在这里产生任何影响,因为您仍在使用天真的日期时间对象。 (至少你没有混合来自 time 模块的其他类型并丢弃精度,但你没有解决你的问题。)


您的问题的解决方案取决于您要做什么。这些是 UTC 时间戳吗?它们是您在带外知道的某个已知时区的时间戳吗?

如果一切都是 UTC,最好的办法是显式创建 UTC 对象,但最简单的做法(特别是如果您需要代码在 2.7 中运行)是:

 d - datetime.utcfromtimestamp(0)

这为您提供了一个表示自纪元以来 0 UTC 秒的原始日期时间,并从表示自纪元以来 X UTC 秒的原始日期时间中减去它,因此您得到一个 timedelta 代表 X 秒(具体来说,17666 天,37500秒),而不考虑系统使用的时区。

或者,对现有代码的最小更改是使用 utctimetuple 而不是 timetuple ,它以更复杂的方式做同样的事情。

原文由 abarnert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题