Python datetime对象修改日期后未自动切换夏令时时区问题
问题分析与解决方案
这不是一个已知bug,而是datetime.replace()方法的预期行为:
replace()方法只会直接替换datetime对象的年/月/日/时等字段值,不会重新计算时区偏移量。你最初的timestamp是基于当前时间(夏令时结束后,+12时区)生成的,调用replace()后只是修改了日期时间字段,原有的时区偏移(+12)会被直接保留,不会根据新的日期自动切换到夏令时的+13偏移。
正确的实现方式
要得到对应日期正确的夏令时偏移,需要重新基于目标日期构造aware datetime,而不是用replace():
from django.utils import timezone from datetime import datetime # 构造naive的目标日期时间 target_naive = datetime(2024, 4, 1, 19, 0, 0) # 本地化到当前时区(会自动计算夏令时偏移) timestamp = timezone.make_aware(target_naive) print(timestamp) # 输出应为:2024-04-01 19:00:00+13:00
或者直接使用时区对象的localize方法(如果需要更明确指定时区):
from pytz import timezone as pytz_timezone nz_tz = pytz_timezone('Pacific/Auckland') target_naive = datetime(2024, 4, 1, 19, 0, 0) timestamp = nz_tz.localize(target_naive) print(timestamp)
补充说明
Django的timezone.localtime()返回的是带有当前时区信息的aware datetime,但replace()不会触发时区对象的偏移重新计算逻辑。夏令时的偏移是由时区对象根据具体日期动态判断的,只有在初始化aware datetime或转换时区时才会执行这个判断逻辑。
内容的提问来源于stack exchange,提问作者James Lin
相关产品推荐
相关产品推荐

