为何1970年前的datetime调用timestamp()在MacOS正常Windows报错?
差异根因
这个跨平台表现不一致的核心原因是操作系统底层时间API的支持范围不同,和Python版本逻辑无关:
- MacOS属于类Unix系统,底层时间函数原生支持1970年1月1日UTC(Unix时间纪元起点)之前的时间点,这类早于纪元的时间会返回负的时间戳值,你在Mac上得到的
-31539600.0就是1969年1月1日距离纪元点的准确秒数差,运行完全符合预期。 - Windows系统的原生时间接口不支持1970年1月1日UTC之前的时间转换,Python在Windows环境下调用
.timestamp()方法时会直接调用系统底层能力,传入早于纪元的datetime对象时就会抛出OSError: [Errno 22] Invalid argument错误,属于系统层面的限制。
跨平台兼容写法
如果需要代码同时在MacOS、Windows环境下正常处理1970年之前的时间,可以绕过系统原生接口,手动计算时间戳:
from datetime import datetime, timezone # 以UTC时区的Unix纪元为基准做计算,避免本地时区带来的误差 unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) target_date = datetime(1969, 1, 1, tzinfo=timezone.utc) timestamp = (target_date - unix_epoch).total_seconds()
如果使用的是不带时区信息的本地时间datetime对象,计算前需要先补上对应本地时区的偏移配置,否则计算结果会和原生
.timestamp()的返回值存在偏差。
内容的提问来源于stack exchange,提问作者TheUltimateOptimist
相关产品推荐
相关产品推荐

