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

计算两个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计算,两者的计算基准完全不同,自然结果不一致。

修复方案

  1. 统一用UTC作为计算基准,正确获取当前UTC时间:
# 写法1
cur_time = pytz.utc.localize(datetime.utcnow())
# 写法2
cur_time = datetime.now(pytz.utc)
  1. 确认文件名中时间的所属时区,如果是伦敦本地时间,就用伦敦时区标记,不要直接用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)
  1. 计算差值时直接用UTC时区的两个带时区对象相减,避免多次时区转换带来的额外问题:
diff = cur_time_utc - rr_time_utc
  1. 正则匹配优化,避免文件名有多个下划线或点时匹配错误:
rr_time_str = re.search(r'_(\d+)\.txt', rr_name).group(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:06:04