时间戳转日期 Python

3
我想将时间戳(我不知道如何转换)转换为日期时间。我有以下输入:1217099350.0。如果我在Libreoffice calc中输入以下内容(1217099350.0 / 86400)+ 29226并将单元格格式设置为日期时间,我将得到正确的输出:
31/07/2018 19:09:10

但是如果我用Python编写这个程序:

tt = 1217099350.0
tt2 = (tt / 86400.) + 29226.
tt3 = datetime.fromtimestamp(tt2).strftime("%Y-%M-%d %H:%m:%S"
print(tt3)

我有以下输出:

1970-01-01 09:01:52

我的代码出了什么问题?

谢谢!祝好!


在我看来没问题。(1217099350 / 86400) + 29226 大约是43312,这大致是十二小时时间段内的秒数,所以得出的日期时间大约是Unix纪元后十二小时。如果有什么问题,那就是Libreoffice的问题。 - Kevin
我不知道,因为在Excel中我得到了相同的结果。在我工作的公司中,他们使用Excel来进行此转换,而我想自动化这个任务。 - Emmanuel Arias
2个回答

7

Emmanuel,

在Python中更改Epoch可能需要大量工作。在调用datetime.utfromtimestamp之前,将LibreOffice时间戳转换为Posix时间戳进行一些数学计算可能会更容易。

然而,如果您使用1970年1月1日之前的时间戳,则此方法不起作用。

from datetime import datetime
tt = 1217099350.0
tt2 = (tt / 86400.) + 29226.
# At this point tt2 has days since the LibreOffice Epoch.  Below, it
# is converted to seconds since Posix epoch.
tt3 = tt2 - 25569.  # There are 25569 days between LibreOffice and Posix epoch
tt4 = tt3 * 86400.  # Convert timestamp from days to seconds
tt5 = datetime.utcfromtimestamp(tt4).strftime("%Y-%m-%d %H:%M:%S")
print(tt5)

2018-07-31 19:09:10

3

看起来LibreOffice纪元与Posix纪元不同。我找到了这篇文章,可能会有帮助。

https://syslog.me/2012/08/28/dates-from-unix-timestamps-in-openoffice-libreoffice/

Posix纪元是UTC时间1970年1月1日午夜。

>>> datetime.utcfromtimestamp(0).strftime("%Y-%m-%d %H:%M:%S")
'1970-01-01 00:00:00'

LibreOffice纪元是1899年12月30日。

除以86400表示您正在尝试将秒转换为天。然而,Python中的datetime.fromtimestamp函数期望以秒为单位的时间戳。

此外,在调用strftime时,您颠倒了月份和分钟。 %M表示分钟,%m表示月份。

最后,您可能希望使用utcfromtimestamp而不是fromttimestamp来避免时区问题。


太好了!我该如何在Python的datetime模块中更改纪元日? - Emmanuel Arias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接