Unix时间戳转日期JS可正常转换,Python报错该如何解决
问题解决:微秒级Unix时间戳在Python3.9中的转换方法
错误原因
- 你传入的
1615370972685000是微秒级Unix时间戳(1秒=1000000微秒),而Python的datetime.datetime.utcfromtimestamp()仅接收秒级时间戳作为输入。 - 你之前仅除以1000得到的是毫秒级数值,依旧远超出函数支持的输入范围,所以会抛出
OSError: [Errno 22] Invalid argument错误。 - JS代码能得到正确结果的原因是:JS的
Date()构造函数接收毫秒级时间戳,原JS代码中将微秒级时间戳除以1000转成毫秒后传入,刚好符合JS的参数要求。
正确实现代码
1. 转换为UTC时间
import datetime ts = 1615370972685000 # 微秒级转秒级,除以1e6即可 utc_dt = datetime.datetime.utcfromtimestamp(ts / 1_000_000) print(utc_dt) # 输出结果:2021-03-10 10:09:32.685000,和JS输出的GMT+0100结果刚好差1小时时区差,逻辑完全匹配
2. 转换为和JS输出完全一致的GMT+1时区时间
Python3.9内置了zoneinfo模块,可以直接指定时区转换:
from datetime import datetime from zoneinfo import ZoneInfo ts = 1615370972685000 # 选择GMT+1对应的时区,比如欧洲巴黎时区 local_dt = datetime.fromtimestamp(ts / 1_000_000, tz=ZoneInfo("Europe/Paris")) # 格式化输出和JS完全一致的格式 print(local_dt.strftime("%a %b %d %Y %H:%M:%S GMT%z")) # 输出结果:Wed Mar 10 2021 11:09:32 GMT+0100
补充说明
如果需要保留原始时间戳的微秒精度也无需额外处理,除以1e6后的小数部分会被datetime自动识别为微秒信息。
内容的提问来源于stack exchange,提问作者Ignat Talitskikh
相关产品推荐
相关产品推荐

