计算两个datetime对象时间差结果与预期不符的问题求助
问题代码
from datetime import datetime import pytz import re # 原代码缺失re导入 cur_time = datetime.now() cur_time = pytz.utc.localize(cur_time) rr_name = 'xx_20211005141746.txt' rr_time = re.search('_(.*).txt', rr_name).group(1) rr_time = datetime.strptime(rr_time, '%Y%m%d%H%M%S') tzone = "Europe/London" hb_time = pytz.utc.localize(rr_time).astimezone(pytz.timezone(tzone)) diff = cur_time - hb_time l_heared = round((diff.total_seconds() / 60), 2)
异常原因
核心问题是时区标记逻辑错误,具体触发点如下:
datetime.now()默认返回运行设备的本地时区原生datetime,直接用pytz.utc.localize()处理,并没有做时区转换,只是错误地给本地时间强制套上了UTC的时区属性。比如设备时区是东八区,datetime.now()得到12点,套UTC时区后会被识别为UTC时间12点,而真实UTC时间实际是4点,直接产生8小时偏差。- 代码默认文件名提取的时间字符串是UTC时间,如果这个时间本身就是伦敦时区的本地时间,直接用UTC标记后转伦敦时区,2021年10月英国处于夏令时,会额外多出1小时偏差。
你提到的原生cur_time和rr_time直接相减得到6分钟,是因为两个原生datetime都没有时区信息,直接按数值相减,而代码里的带时区datetime相减会自动对齐到UTC计算,两者的计算基准完全不同,自然结果不一致。
修复方案
- 统一用UTC作为计算基准,正确获取当前UTC时间:
# 写法1 cur_time = pytz.utc.localize(datetime.utcnow()) # 写法2 cur_time = datetime.now(pytz.utc)
- 确认文件名中时间的所属时区,如果是伦敦本地时间,就用伦敦时区标记,不要直接用UTC:
london_tz = pytz.timezone("Europe/London") rr_time = london_tz.localize(datetime.strptime(rr_time_str, '%Y%m%d%H%M%S')) # 统一转UTC再计算差值 rr_time_utc = rr_time.astimezone(pytz.utc)
- 计算差值时直接用UTC时区的两个带时区对象相减,避免多次时区转换带来的额外问题:
diff = cur_time_utc - rr_time_utc
- 正则匹配优化,避免文件名有多个下划线或点时匹配错误:
rr_time_str = re.search(r'_(\d+)\.txt', rr_name).group(1)
内容的提问来源于stack exchange,提问作者ManCity10
相关产品推荐
相关产品推荐

