Task #1688: 修复OCR日期截断修正误判问题 - 当OCR把日期和时间合并(如2026/9/222:57:00)导致d>31时,尝试恢复原始日期而非盲目截断

This commit is contained in:
youpaishidifu
2026-09-11 10:04:40 +08:00
parent cfd89ef963
commit 0f66a90aa5
+48 -14
View File
@@ -7060,21 +7060,55 @@ class MessageMonitor:
if y < 1900 or y > 2100:
logger.debug(f"[ocr] 日期年份异常({y}),OCR识别错误,跳过: {date_str}")
continue
# 尝试从d向下截断,找到第一个合法且≤今天的日期
# ⭐ Task #1688: 修复OCR把日期和时间合并导致截断修正错误的问题
# 问题:OCR把"2026/9/2"和"22:57:00"合并成"2026/9/222:57:00"
# 正则匹配到"2026/9/22"(d=22),截断循环从22向下找到11(今天)
# 导致消息被误判为"今天的历史消息"丢弃
# 根因:d>31说明OCR合并了日期和时间,需要回溯恢复原始日期
if d > 31:
# OCR合并了日期和时间:尝试去掉最后一位数字恢复原始日期
# 例:2026/9/22 → 尝试2026/9/2(去掉最后一位2)
original_d = d // 10 # 去掉最后一位数字
if original_d > 0:
try:
date_obj = datetime(y, m, original_d).date()
if date_obj <= today:
fixed_str = f"{y}/{m}/{original_d}"
logger.debug(f"[ocr] 日期截断修正(OCR合并修正): {date_str} → {fixed_str}")
dates.append(fixed_str)
found = True
except ValueError:
pass
# 如果恢复失败,尝试其他可能的原始日期(如22→2)
if not found:
# 尝试更激进的恢复:去掉所有可能的数字
for try_d in [d % 10, d // 10, d // 100]:
if try_d > 0:
try:
date_obj = datetime(y, m, try_d).date()
if date_obj <= today:
fixed_str = f"{y}/{m}/{try_d}"
logger.debug(f"[ocr] 日期截断修正(OCR合并修正-备选): {date_str} → {fixed_str}")
dates.append(fixed_str)
found = True
break
except ValueError:
continue
# 正常截断逻辑:从d向下截断,找到第一个合法且≤今天的日期
# 处理:2026/8/31(未来)→ 2026/8/3(过去),2026/8/32(非法)→ 2026/8/3
found = False
for try_d in range(d, 0, -1):
try:
date_obj = datetime(y, m, try_d).date()
if date_obj <= today:
fixed_str = f"{y}/{m}/{try_d}"
if fixed_str != date_str:
logger.debug(f"[ocr] 日期截断修正: {date_str} → {fixed_str}")
dates.append(fixed_str)
found = True
break
except ValueError:
continue
if not found:
for try_d in range(d, 0, -1):
try:
date_obj = datetime(y, m, try_d).date()
if date_obj <= today:
fixed_str = f"{y}/{m}/{try_d}"
if fixed_str != date_str:
logger.debug(f"[ocr] 日期截断修正: {date_str} → {fixed_str}")
dates.append(fixed_str)
found = True
break
except ValueError:
continue
if not found:
logger.debug(f"[ocr] 日期解析失败: {date_str}")