diff --git a/monitor.py b/monitor.py index 8668228..c78bc4b 100644 --- a/monitor.py +++ b/monitor.py @@ -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}")