为什么Python的datetime类有' fromtimestamp '方法,却没有'totimestamp'方法?

9 投票
1 回答
771 浏览
提问于 2025-04-17 06:55

Python的datetime类有一个fromtimestamp方法,可以用来根据时间戳创建一个datetime对象,但它没有提供一个totimestamp的方法来反向操作……我知道可以用time.mktime(x.timetuple())datetime对象转换成时间戳,但我觉得这个方法看起来有点复杂,所以我很好奇为什么没有totimestamp这个方法呢?

1 个回答

13

我记得之前有个关于这个问题的讨论/错误报告。简单来说,很多人提出了各种解决方案,但出于某种原因,没有一个被接受。

我觉得这个问题的关键可以在这条回复中得到很好的总结:

很多人都提出了不错的解决方案。但没有人能提出一个让你满意的方案,因为你对问题的要求太严格了。至今我们还没有utctotimestamp()这个函数,原因是你,至少我知道的只有你,拒绝接受一个在微秒精度范围内反转utcfromtimestamp()的方法。这个方法是一个完全合理且可接受的解决方案,会给Python语言带来很大的价值。

我怀疑你并没有意识到,你无意中给Python用户带来了多大的困扰,因为你一个人阻碍了这个问题的进展。我见过很多人:学生、朋友、同事——甚至是非常聪明能干的人都被这个问题难住了。没有人会想到去查看日历模块。也许如果你看到他们为此苦苦挣扎,你就会明白了。

这个故事的最终结果是增加了文档,教你如何自己解决这个问题:

# On the POSIX compliant platforms, `utcfromtimestamp(timestamp)` is
# equivalent to the following expression:
datetime(1970, 1, 1) + timedelta(seconds=timestamp)

# There is no method to obtain the timestamp from a `datetime` instance,
# but POSIX timestamp corresponding to a `datetime` instance `dt` can be
# easily calculated as follows. For a naive `dt`:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)

# And for an aware ``dt``::
timestamp = (dt - datetime(1970, 1, 1, tzinfo=timezone.utc)) / timedelta(seconds=1)

撰写回答