如何修复Python语音助手调用Google Calendar API添加日历事件的时间错误
修复Python语音助手日历事件解析问题
原代码问题梳理
- 日期解析逻辑错误:解析日期时误用了
parts[i](即"tarihinde"指令词),实际目标日期在该词的下一个位置parts[i+1] time变量未初始化:若语音命令未提及"saat",后续判断time is None会触发未定义错误- 未合并时间到日期对象:即便解析到时间,也未将其同步到
date变量中,导致始终用当前时间生成事件 - 事件标题(summary)生成混乱:将日期、时间相关指令词混入标题,未过滤无效内容
- 缺少时间格式处理:仅提取时间字符串,未转换为datetime可识别的时间格式
修复方案及完整代码
以下是修复后的代码,关键修复点已添加注释:
from datetime import datetime, timedelta def parse_command(command): # 初始化日期为当前日期,时间默认清零(后续可通过命令覆盖) date = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) summary = "" time = None # 初始化time变量,避免未定义错误 parts = command.split(" ") for i in range(len(parts)): if parts[i] == "saat" and i+1 < len(parts): try: # 解析24小时制时间(如"2"对应02:00) hour = int(parts[i+1]) # 将解析到的小时同步到date对象 date = date.replace(hour=hour) time = parts[i+1] except ValueError: print("Geçersiz saat formatı. Lütfen sayı olarak girin.") elif parts[i] == "tarihinde" and i+1 < len(parts): try: # 修正:读取"tarihinde"后的日期字符串 date_str = parts[i+1] parsed_date = datetime.strptime(date_str, "%d/%m/%Y") # 保留已设置的时间,仅替换日期部分 date = date.replace(year=parsed_date.year, month=parsed_date.month, day=parsed_date.day) except ValueError: print("Geçersiz tarih formatı. Lütfen gün/ay/yıl formatında girin.") # 过滤指令关键词,仅保留事件核心标题内容 elif parts[i] not in ["toplantı", "saat", "tarihinde"]: summary += parts[i] + " " # 校验时间是否有效 if time is None: return "Saat belirtilmedi", None, None # 生成日历要求的时间格式,结束时间默认延后1小时 start_time = date.strftime("%Y-%m-%dT%H:%M:%S") + "+00:00" end_time = (date + timedelta(hours=1)).strftime("%Y-%m-%dT%H:%M:%S") + "+00:00" return summary.strip(), start_time, end_time
关键修复说明
- 日期解析修正:将日期读取目标改为
parts[i+1],同时用replace方法保留已设置的时间部分 - 时间处理优化:初始化
time变量,解析"saat"后的数字并同步到date的小时字段 - 标题过滤逻辑:排除指令类关键词,确保标题仅包含会议相关内容
- 默认值调整:初始日期设为当前日期但时间清零,避免未指定时间时误用当前小时
内容的提问来源于stack exchange,提问作者zeyzey
相关产品推荐
相关产品推荐

