fix: 修复OCR日期提取错误导致时间戳误判为未来的问题

- OCR常把日期和时间连在一起:2026/8/319:45:20 → 匹配到2026/8/31(未来/非法)
- 改进日期解析:从d向下截断,找到第一个合法且≤今天的日期
- 处理:2026/8/31(未来8月31日)→ 2026/8/3(过去8月3日)
- 处理:2026/8/32(非法日期)→ 2026/8/3(过去8月3日)
- 这样has_past_date=True,时间戳19:44/21:13等不会被误判为未来时间
This commit is contained in:
youpaishidifu
2026-08-04 09:47:57 +08:00
parent 161d2dd95b
commit 7d8d39f7b6
2 changed files with 47 additions and 19 deletions
+47 -19
View File
@@ -3594,29 +3594,57 @@ class MessageMonitor:
logger.debug(f"[ocr] 提取到时间戳: {timestamps}")
# 提取日期信息(如2026/8/2、2026-08-02等),用于判断时间戳是否真的是"未来"
dates = re.findall(r'\d{4}[/-]\d{1,2}[/-]\d{1,2}', text)
# 标准化日期分隔符
dates = [d.replace('-', '/') for d in dates]
# OCR常把日期和时间连在一起:2026/8/319:45:20 → 匹配到2026/8/31(未来/非法)
# 需要截断到最后一个合法且≤今天的日期
raw_dates = re.findall(r'\d{4}[/-]\d{1,2}[/-]\d{1,2}', text)
raw_dates = [d.replace('-', '/') for d in raw_dates]
today = datetime.now().date()
# 改进日期解析:处理OCR把日期和时间连在一起的情况
dates = []
for date_str in raw_dates:
parts = date_str.split('/')
if len(parts) != 3:
continue
try:
y, m, d = int(parts[0]), int(parts[1]), int(parts[2])
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:
logger.debug(f"[ocr] 日期解析失败: {date_str}")
logger.debug(f"[ocr] 提取到日期: {dates}")
# 计算日期差:如果是过去的日期(昨天或更早),时间戳不应该是"未来时间戳"
has_past_date = False
if dates:
today = datetime.now().date()
for date_str in dates:
try:
# 解析日期:2026/8/2 或 2026/08/02
parts = date_str.split('/')
if len(parts) == 3:
y, m, d = int(parts[0]), int(parts[1]), int(parts[2])
date_obj = datetime(y, m, d).date()
date_diff = (today - date_obj).days
if date_diff > 0: # 昨天或更早
has_past_date = True
logger.debug(f"[ocr] 检测到过去日期: {date_str} (距今{date_diff}天)")
break
except (ValueError, IndexError):
pass
for date_str in dates:
try:
parts = date_str.split('/')
if len(parts) == 3:
y, m, d = int(parts[0]), int(parts[1]), int(parts[2])
date_obj = datetime(y, m, d).date()
date_diff = (today - date_obj).days
if date_diff > 0: # 昨天或更早
has_past_date = True
logger.debug(f"[ocr] 检测到过去日期: {date_str} (距今{date_diff}天)")
break
except (ValueError, IndexError):
pass
if not timestamps:
# ⭐ 无可见时间戳:仅超短中文消息(如"好的""嗯")视为可能的新消息放行;
# 较长文本无时间戳 → 无法验证新鲜性,可能是不含时间戳的历史/UI噪声
BIN
View File
Binary file not shown.