Python日期时间到纪元

标签 python python-3.x python-2.7

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/

相关文章:

python - 如何在已放置的 QLabel 或 QPixmap 之上使用 QPainter 进行绘制?

python - GCP ML 引擎预测失败 : Error processing input: Expected float32 got base64

python - 将多个 csv 文件读取到单独的 pandas 数据帧中

python-3.x - 如何在 Pandas 数据框列中找到第一个连续值并删除该行?

python - 为什么 os.walk() 没有定义目录或文件?

python - TA-Lib Python Wrapper only length-1 数组错误

python - 解释器交互模式的目的是保持文件打开

python - 如何将图表和表格组合成一张绘图图像

python - 将 Flask-Injector 与 Flask-restplus 一起使用会导致调用 api 资源时出错

python - 查找列表中的连续模式