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
相关产品推荐
相关产品推荐

