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

Python中datetime使用==判断相等未触发if分支问题求助

问题原因
  • 核心精度问题:datetime.now()返回的时间自带微秒位,而从文件读取解析得到的alarm_time精度只到秒,两个对象的微秒位永远不一致,所以==判断永远为假
  • 语法错误:datetime.strptime()的第一个参数要求是字符串,你直接传入了datetime类型的ga,会直接抛出类型错误,而你用except Exception吞掉了所有异常,所以这段错误逻辑直接被跳过,根本跑不到相等判断的分支
  • 文件读取逻辑错误:你把文件打开操作放在了while循环外部,第一次循环读取完全部内容后,文件指针会停在文件末尾,后续所有循环的for lines in sf_timer都读不到任何内容,无法正确更新alarm_time
  • 无效判断:len(str(sf_timer))是把文件对象转成字符串后取长度,结果固定大于0,这个判断没有任何实际作用
  • 无休眠逻辑:死循环无间隔运行,不仅会占用极高的CPU资源,极端情况下还可能因为进程调度刚好跳过目标秒的判断窗口
修复方案
  1. 把当前时间的微秒位清零,保证和alarm_time的精度一致
  2. 删掉错误的strptime(ga, formatit)逻辑,直接处理datetime对象的精度
  3. 每次循环重新读取文件内容,保证能拿到最新的闹钟时间(适配多进程修改文件的场景)
  4. 去掉无效的文件长度判断,增加读取内容的合法性校验
  5. 循环中增加短休眠,降低CPU占用,同时保证不会错过判断窗口
  6. 调整异常捕获范围,不要吞掉所有异常,方便后续排查问题
修复后代码
import time
from datetime import datetime

def background_checker():
    formatit = '%d.%m.%Y %H:%M:%S'
    while True:
        try:
            # 每次循环重新读取文件,获取最新的闹钟时间
            with open('safe_timer.txt','r', encoding='utf-8') as sf_timer:
                line = sf_timer.readline().strip()
                if not line:
                    time.sleep(0.5)
                    continue
                alarm_time = datetime.strptime(line, formatit)
            # 把当前时间微秒清零,和闹钟时间精度对齐
            current_time = datetime.now().replace(microsecond=0)
            if current_time == alarm_time:
                print('alarm')
                # 同秒内只触发一次,避免重复执行
                time.sleep(1)
        except (ValueError, IOError):
            # 仅捕获时间解析、文件读写类的预期异常
            pass
        finally:
            # 每次循环休眠0.5秒,降低CPU占用的同时不会错过秒级判断窗口
            time.sleep(0.5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:09:02