diff --git a/commands/handlers.py b/commands/handlers.py index b183db0..4f2d057 100644 --- a/commands/handlers.py +++ b/commands/handlers.py @@ -693,17 +693,36 @@ def handle_reminder(ctx: 'MessageContext', match: Optional[Match]) -> bool: validation_error = "提醒内容太短" else: # 验证时间格式 - try: - if data["type"] == "once": - dt = datetime.strptime(data["time"], "%Y-%m-%d %H:%M") - if dt < datetime.now(): - validation_error = f"时间 ({data['time']}) 必须是未来的时间" - elif data["type"] in ["daily", "weekly"]: - datetime.strptime(data["time"], "%H:%M") # 仅校验格式 + time_value = data.get("time", "") + if data["type"] == "once": + parsed_dt = None + for fmt in ("%Y-%m-%d %H:%M", "%Y-%m-%d %H:%M:%S"): + try: + parsed_dt = datetime.strptime(time_value, fmt) + break + except ValueError: + continue + if not parsed_dt: + validation_error = f"时间格式错误 ({time_value})" + elif parsed_dt < datetime.now(): + validation_error = f"时间 ({time_value}) 必须是未来的时间" else: - validation_error = f"不支持的提醒类型: {data.get('type')}" - except ValueError: - validation_error = f"时间格式错误 ({data.get('time', '')})" + # 统一存储格式为分钟精度,避免比较时出错 + data["time"] = parsed_dt.strftime("%Y-%m-%d %H:%M") + elif data["type"] in ["daily", "weekly"]: + parsed_time = None + for fmt in ("%H:%M", "%H:%M:%S"): + try: + parsed_time = datetime.strptime(time_value, fmt) + break + except ValueError: + continue + if not parsed_time: + validation_error = f"时间格式错误 ({time_value})" + else: + data["time"] = parsed_time.strftime("%H:%M") + else: + validation_error = f"不支持的提醒类型: {data.get('type')}" # 验证周提醒 (如果类型是 weekly 且无验证错误) if not validation_error and data["type"] == "weekly": diff --git a/function/func_reminder.py b/function/func_reminder.py index 5767736..f2f1dbc 100644 --- a/function/func_reminder.py +++ b/function/func_reminder.py @@ -118,21 +118,47 @@ class ReminderManager: # 进一步校验时间格式 (根据类型) weekday_val = None # 初始化 weekday - try: - if data["type"] == "once": - # 尝试解析,确保格式正确,并且是未来的时间 - trigger_dt = datetime.strptime(data["time"], "%Y-%m-%d %H:%M") - if trigger_dt <= datetime.now(): - return False, f"一次性提醒时间 ({data['time']}) 必须是未来的时间" - elif data["type"] == "daily": - datetime.strptime(data["time"], "%H:%M") # 只校验格式 - elif data["type"] == "weekly": - datetime.strptime(data["time"], "%H:%M") # 校验时间格式 - if "weekday" not in data or not isinstance(data["weekday"], int) or not (0 <= data["weekday"] <= 6): - return False, "每周提醒必须提供有效的 weekday 字段 (0-6)" - weekday_val = data["weekday"] # 获取 weekday 值 - except ValueError as e: - return False, f"时间格式错误 ({data['time']}),需要 'YYYY-MM-DD HH:MM' (once) 或 'HH:MM' (daily/weekly): {e}" + time_value = data.get("time", "") + if data["type"] == "once": + # 尝试解析,确保格式正确,并且是未来的时间 + trigger_dt = None + for fmt in ("%Y-%m-%d %H:%M", "%Y-%m-%d %H:%M:%S"): + try: + trigger_dt = datetime.strptime(time_value, fmt) + break + except ValueError: + continue + if not trigger_dt: + return False, f"一次性提醒时间格式错误 ({time_value}),需要 'YYYY-MM-DD HH:MM' 或 'YYYY-MM-DD HH:MM:SS'" + if trigger_dt <= datetime.now(): + return False, f"一次性提醒时间 ({time_value}) 必须是未来的时间" + # 统一保存为分钟精度 + data["time"] = trigger_dt.strftime("%Y-%m-%d %H:%M") + elif data["type"] == "daily": + parsed_time = None + for fmt in ("%H:%M", "%H:%M:%S"): + try: + parsed_time = datetime.strptime(time_value, fmt) + break + except ValueError: + continue + if not parsed_time: + return False, f"每日提醒时间格式错误 ({time_value}),需要 'HH:MM' 或 'HH:MM:SS'" + data["time"] = parsed_time.strftime("%H:%M") + elif data["type"] == "weekly": + parsed_time = None + for fmt in ("%H:%M", "%H:%M:%S"): + try: + parsed_time = datetime.strptime(time_value, fmt) + break + except ValueError: + continue + if not parsed_time: + return False, f"每周提醒时间格式错误 ({time_value}),需要 'HH:MM' 或 'HH:MM:SS'" + data["time"] = parsed_time.strftime("%H:%M") + if "weekday" not in data or not isinstance(data["weekday"], int) or not (0 <= data["weekday"] <= 6): + return False, "每周提醒必须提供有效的 weekday 字段 (0-6)" + weekday_val = data["weekday"] # 获取 weekday 值 # 准备插入数据库 sql = """ @@ -395,4 +421,4 @@ class ReminderManager: return False, f"删除提醒时发生数据库错误: {e}", 0 except Exception as e: logger.error(f"用户 {wxid} 删除所有提醒时发生意外错误: {e}", exc_info=True) - return False, f"删除提醒时发生未知错误: {e}", 0 \ No newline at end of file + return False, f"删除提醒时发生未知错误: {e}", 0