You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:49:09