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)
给我:15263 799 repl.it(python 3.6.1)上的 00000
和
在我的本地:15263 979 00000 (python 2.7.14)
为什么?
将日期时间对象转换为纪元的推荐方法是什么?
最佳答案
您的问题是您使用的是幼稚的 datetime
(和 struct_tm
等)对象。因此,您要问 2018 年 5 月 15 日 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 毫秒,或者您需要的任何其他内容。)
但是这些都不会在这里产生任何影响,因为您仍在使用天真的日期时间对象。 (至少你没有从
time
模块中混入其他类型并丢弃精度,但你没有解决你的问题。)您的问题的解决方案取决于您要执行的操作。这些是UTC时间戳吗?它们是您在带外知道的某个已知时区的时间戳吗?
如果一切都是 UTC,最好的做法是显式创建 UTC 对象,但最简单的做法(特别是如果您需要在 2.7 中运行代码)是:
d - datetime.utcfromtimestamp(0)
这为您提供了一个表示自纪元以来 0 UTC 秒的天真日期时间,并从表示自纪元以来 X UTC 秒数的天真日期时间中减去它,因此您得到
timedelta
表示 X 秒(特别是 17666 天,37500 秒),与系统使用的时区无关。或者,对现有代码的最小更改是使用
utctimetuple
而不是 timetuple
,它以更复杂的方式做同样的事情。
关于Python日期时间到纪元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356572/