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

Django调用datetime.fromtimestamp转换时间戳报OSError如何解决?

报错原因

这个OSError [Errno 22] 报错几乎都是传入的时间戳数值超出了当前操作系统的支持范围,常见触发场景有两个:

  • 你拿到的是13位毫秒级时间戳,而datetime.fromtimestamp默认接收的是秒级时间戳,毫秒级数值过大超出系统支持上限
  • 时间戳为负数(对应1970年之前的时间),或者数值超出当前系统的时间戳范围:Windows系统默认支持的时间戳范围为1970-01-01 ~ 3001-01-01,Linux系统支持范围更大但也存在边界,超出就会触发报错
解决方法

第一步:先排查时间戳格式

先加调试代码确认你拿到的时间戳格式:

time_val = request.data["time"]
print(f"原始值:{time_val},转int后:{int(time_val)},位数:{len(str(int(time_val)))}")

第二步:按场景修复

场景1:确认是13位毫秒级时间戳

把时间戳除以1000转为秒级即可:

timestamp = int(request.data["time"])
# 自动判断是否为毫秒级时间戳
if len(str(timestamp)) == 13:
    timestamp = timestamp / 1000
date_time = datetime.fromtimestamp(timestamp)

场景2:时间戳超出本地系统范围

可以先转UTC时间规避本地时区的范围限制,再按需转对应时区:

from datetime import datetime, timezone, timedelta

timestamp = int(request.data["time"])
if len(str(timestamp)) == 13:
    timestamp /= 1000
# 先转UTC时间,不受本地系统时区范围限制
utc_dt = datetime.fromtimestamp(timestamp, tz=timezone.utc)
# 如需转东八区本地时间可补充以下代码
local_dt = utc_dt.astimezone(timezone(offset=timedelta(hours=8)))

场景3:存在非法时间戳输入

加异常捕获处理边界情况,避免程序直接报错:

try:
    timestamp = int(request.data["time"])
    if len(str(timestamp)) == 13:
        timestamp /= 1000
    date_time = datetime.fromtimestamp(timestamp)
except (ValueError, OSError):
    # 可根据业务需求设置默认值,或者返回参数错误响应
    date_time = datetime.now()
    # Django视图中可直接返回错误响应
    # return Response({"msg": "time参数非法"}, status=400)

内容的提问来源于stack exchange,提问作者leauradmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:03