Python中tzinfo为None时datetime的DST异常:timestamp差值为0
为什么无时区信息的datetime对象调用timestamp()和直接减法的结果不一致?
在3月最后一个周日执行以下Python代码:
>>> from datetime import datetime >>> before = datetime.fromisoformat("2023-03-26 02:00:01") >>> after = datetime.fromisoformat("2023-03-26 03:00:01") >>> print(before.tzinfo) None >>> print(after.tzinfo) None >>> after.timestamp() - before.timestamp() 0.0
明明两个时间间隔1小时,但timestamp()的差值却是0.0。原本以为当tzinfo为None时,Python不会处理夏令时(DST)。
但直接用减法运算符计算时,结果却正确:
>>> after - before datetime.timedelta(seconds=3600)
为什么会出现这种差异?
核心原因:两种操作的逻辑完全不同
直接减法(
after - before):这是纯粹的本地时间算术,只计算两个datetime对象的年、月、日、时、分、秒的数值差值,完全不考虑时区或夏令时规则。它把before和after当作两个独立的"日历时间点",直接做数值差,所以得到的是1小时的间隔。timestamp()方法:这个方法的作用是把本地时间转换为UTC时间戳(从1970-01-01 UTC开始的秒数)。当tzinfo为None时,Python会把该datetime视为本地时区的时间,自动应用本地系统的夏令时规则。
在示例里,2023年3月26日是欧洲部分地区(比如CET时区)切换夏令时的日子:时钟从02:00直接跳到03:00,也就是说本地时间的2023-03-26 02:00:01和03:00:01实际上对应同一个UTC时间点——因为02:00之后夏令时生效,时钟拨快1小时,所以这两个本地时间转换为UTC后是同一个时刻,因此timestamp差值为0.0。
简单总结:
- 减法只算"表面时间差",不管实际时间是否存在或重复
timestamp()要映射到真实的UTC时间,会考虑本地时区的夏令时规则
内容的提问来源于stack exchange,提问作者Isidro Arias
相关产品推荐
相关产品推荐

