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资源,极端情况下还可能因为进程调度刚好跳过目标秒的判断窗口
修复方案
- 把当前时间的微秒位清零,保证和
alarm_time的精度一致 - 删掉错误的
strptime(ga, formatit)逻辑,直接处理datetime对象的精度 - 每次循环重新读取文件内容,保证能拿到最新的闹钟时间(适配多进程修改文件的场景)
- 去掉无效的文件长度判断,增加读取内容的合法性校验
- 循环中增加短休眠,降低CPU占用,同时保证不会错过判断窗口
- 调整异常捕获范围,不要吞掉所有异常,方便后续排查问题
修复后代码
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
相关产品推荐
相关产品推荐

