使用time.gmtime转换Unix时间戳报错OSError:无效参数
Unix纪元时间(微秒级)转换为可读时间的Python解决方案
问题根源
你传入的1693063813031885是微秒级Unix时间戳,但Python的time.gmtime()仅支持秒级整数时间戳,直接传入超大数值会超出有效范围,触发OSError: [Errno 22] Invalid argument。
解决方案
推荐使用datetime模块处理高精度时间和时区转换,以下两种方法均可得到你想要的输出:
方法一:拆分秒与微秒,手动转换时区
from datetime import datetime, timedelta # 微秒级时间戳 micro_ts = 1693063813031885 # 拆分出秒数和微秒数 seconds = micro_ts // 1000000 microseconds = micro_ts % 1000000 # 先转为UTC时间,再减去5小时得到UTC-05:00时间 utc_dt = datetime.utcfromtimestamp(seconds).replace(microsecond=microseconds) target_dt = utc_dt - timedelta(hours=5) # 格式化输出,匹配预期格式 formatted = target_dt.strftime("%Y-%m-%d-%H:%M:%S.%f") final_output = f"{formatted[:-3]}_{formatted[-3:]} (UTC-05:00)" print(final_output)
方法二:直接指定时区转换
from datetime import datetime, timezone, timedelta micro_ts = 1693063813031885 # 转换为UTC-05:00时区的datetime对象 target_dt = datetime.fromtimestamp(micro_ts / 1000000, timezone(timedelta(hours=-5))) # 格式化输出 formatted = target_dt.strftime("%Y-%m-%d-%H:%M:%S.%f") final_output = f"{formatted[:-3]}_{formatted[-3:]} (UTC-05:00)" print(final_output)
说明
- 两种方法都先将微秒级时间戳转换为秒级浮点值,保留了微秒精度;
- 时区处理上,两种方式最终结果一致,可根据习惯选择;
%f会输出6位微秒,通过字符串截取拆分出前三位和后三位,用下划线连接,匹配你需要的031_885格式。
内容的提问来源于stack exchange,提问作者OO7
相关产品推荐
相关产品推荐

