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

将year=1的datetime转换为timestamp触发ValueError的原因

问题解答

核心原因

问题出在本地时区偏移和计算机历法表示的兼容性上:

  • Python的datetime.timestamp()方法对无时区信息的naive datetime对象,会默认将其视为本地时间,先转换为UTC时间后,再计算从1970-01-01 UTC开始的秒数。
  • 公历体系中没有“年份0”,公元前1年(1 BCE)之后直接是公元1年,但计算机在日期计算时,通常用“年份0”来表示公元前1年。
  • 当你创建datetime(year=1, month=1, day=1)这个naive datetime对象时,如果你的本地时区比UTC早(比如东八区UTC+8),转换为UTC时会回退8小时,得到公元前1年12月31日16:00:00 UTC——这个日期在计算机内部会被标记为“年份0”,而Python的datetime模块明确禁止年份0,因此触发ValueError: year 0 is out of range。
  • 而datetime(year=1, month=1, day=2)转换为UTC时,即使时区偏移8小时,得到的是公元1年1月1日16:00:00 UTC,年份仍为1,不会触及年份0的限制,所以可以正常转换。

解决方法

如果需要处理这类极早的日期,建议直接创建带UTC时区的datetime对象,避免本地时区偏移导致的历法转换问题:

from datetime import datetime, timezone

# 创建带UTC时区的datetime对象
dt3 = datetime(year=1, month=1, day=1, tzinfo=timezone.utc)
ts3 = dt3.timestamp()
# 输出:-62135596800.0(正确的时间戳)

内容的提问来源于stack exchange,提问作者GregoirePelegrin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:40:31