使用datetime.strptime获取时间戳时触发OSError: [Errno 22] Invalid Argument错误的解决方法
解决datetime.timestamp()抛出OSError: Invalid Argument的问题
这问题我之前在Windows环境下踩过坑!你遇到的错误根源是:当你用strptime只解析时分(%H:%M)时,生成的datetime对象会默认使用1900-01-01作为日期,而Windows系统的timestamp()方法不支持转换1970年1月1日之前的时间(Unix时间戳的起始点是1970-01-01 UTC),所以直接调用就会抛出无效参数的错误。
下面给你几种针对性的解决方案,根据你的实际需求选择:
方案1:结合当前日期生成完整时间戳
如果这个16:30是指当天的下午4点半,那我们需要把解析出的时间和今天的日期合并:
from datetime import datetime, date date_string = "16:30" # 先解析出时间对象 time_part = datetime.strptime(date_string, "%H:%M").time() # 获取今天的日期 today_date = date.today() # 合并为完整的datetime对象 full_datetime = datetime.combine(today_date, time_part) # 转换为时间戳 timestamp = full_datetime.timestamp() print(timestamp)
这样生成的datetime对象日期在1970年之后,就能正常转换为时间戳了。
方案2:指定基准日期(比如1970-01-01)
如果你需要的是相对于Unix纪元起始日的16:30,可以手动指定基准日期:
from datetime import datetime date_string = "16:30" time_part = datetime.strptime(date_string, "%H:%M").time() # 指定基准日期为1970-01-01 base_date = datetime(1970, 1, 1) full_datetime = datetime.combine(base_date.date(), time_part) timestamp = full_datetime.timestamp() print(timestamp) # 输出59400,对应16*3600 + 30*60的总秒数
方案3:直接计算秒数(跳过datetime转换)
如果你的场景不需要完整的日期,只是需要16:30对应的总秒数(比如相对于当天0点),可以直接计算:
hours, minutes = map(int, "16:30".split(":")) total_seconds = hours * 3600 + minutes * 60 print(total_seconds) # 输出59400
这个方法更高效,也不会有系统兼容性问题。
额外注意点
timestamp()方法返回的是UTC时间戳,如果你的本地时区不是UTC,转换时会自动做时区偏移。如果需要精确的UTC时间戳,建议给datetime对象加上时区信息:
from datetime import datetime, timezone date_string = "16:30" full_datetime = datetime.strptime(date_string, "%H:%M").replace( year=1970, month=1, day=1, tzinfo=timezone.utc ) timestamp = full_datetime.timestamp() print(timestamp) # 精确的UTC时间戳59400
内容的提问来源于stack exchange,提问作者Khadija
相关产品推荐
相关产品推荐

