You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:36:07