Python datetime.timestamp()与Discord、Moment.js远古日期时间戳不一致问题
回答
问题根因分为两层
1. 代码写法的时区错误
你构造的datetime.datetime(200, 1, 1, 0, 0, 0)是无时区标注的朴素时间对象,调用timestamp()时Python会默认将其判定为你本地时区(UTC+8)的时间,转换为UTC时间时会自动减8小时,这是你看到的第一部分误差来源。
修正写法可先消除时区偏差:
from datetime import datetime, timezone # 显式指定为UTC时区的200年1月1日0点 d = datetime(200, 1, 1, 0, 0, 0, tzinfo=timezone.utc) print(d.timestamp())
2. 剩余23分18秒误差来自ΔT校正规则差异
消除时区问题后剩余的固定偏差,是Python和Moment.js/JS对1972年之前的时间计算规则不同导致的,不存在多套UNIX纪元体系:
UNIX纪元的定义是统一的(1970-01-01 00:00:00 UTC为0秒),但1972年闰秒机制启用前,人类使用的公历时间是基于地球自转的世界时(UT1),和现在通用的原子时之间存在固定偏差,这个偏差称为ΔT,公元1-200年区间的ΔT值正好为23分18秒左右。
- Python标准库datetime采用纯前置格里高利历计算,默认不对1972年之前的时间做ΔT校正,直接按连续原子时往前推导。
- Moment.js和JS原生Date遵循ECMAScript标准,计算远古日期时会引入历史ΔT数据做校正,将历史上的公历时间转换为和原子时对齐的时间戳,因此会和Python的结果差一个对应年代的ΔT值。
这也符合你观察到的「同一年代不同日期偏差值固定」的现象,和闰年无关。
对齐方案
如果需要和Moment.js的计算结果对齐,可以:
- 使用Python的天文计算库(如skyfield)加载历史ΔT表,计算远古日期时叠加对应年代的ΔT值即可。
- 若业务对精度要求不高,可直接固定叠加23分18秒的偏移量满足需求。
内容的提问来源于stack exchange,提问作者Johann Lau
相关产品推荐
相关产品推荐

