Python中Firebase时间戳转%Y%m%d%H%M%S%f格式报错求助
解决Firebase毫秒级时间戳转"%Y%m%d%H%M%S%f"格式的问题
这个问题我之前也碰到过!核心原因是你混淆了毫秒级和秒级时间戳的区别:Firebase返回的1521508504583是毫秒数,但Python的datetime构造器默认只认秒级时间戳,直接把毫秒数传进去肯定会超出整数范围,所以才会报signed integer is greater than maximum错误。
正确的处理步骤
我们需要把毫秒时间戳拆成秒部分和微秒部分(因为1毫秒=1000微秒),再传给datetime对象,这样就能正确格式化出包含微秒的时间字符串了。
修正后的代码
from datetime import datetime def formatdatetime(sfd): # 拆分毫秒时间戳为秒和微秒 seconds = sfd // 1000 # 取整数秒 microseconds = (sfd % 1000) * 1000 # 把剩余的毫秒转成微秒 # 创建datetime对象(如果需要UTC时间,改用utcfromtimestamp) ts = datetime.fromtimestamp(seconds) # 补上微秒部分 ts = ts.replace(microsecond=microseconds) # 格式化输出 print(ts.strftime("%Y%m%d%H%M%S%f")) formatdatetime(1521508504583)
代码说明
sfd // 1000:将毫秒数向下取整得到秒级时间戳,这是fromtimestamp需要的参数(sfd % 1000)*1000:取毫秒数的余数部分,乘以1000转换成微秒(因为datetime的microsecond属性接受0-999999的数值)replace(microsecond=...):给datetime对象补充微秒信息,这样%f就能正确输出6位的微秒值(比如583毫秒对应583000微秒)
简化写法(注意精度问题)
如果你的场景对时间精度要求不高,也可以直接把毫秒数转成浮点数的秒数传入fromtimestamp:
from datetime import datetime def formatdatetime(sfd): ts = datetime.fromtimestamp(sfd / 1000) print(ts.strftime("%Y%m%d%H%M%S%f")) formatdatetime(1521508504583)
不过这种方式可能会因为浮点数精度问题,导致极少数情况下微秒计算不准确,所以第一种拆分的方法更可靠。
内容的提问来源于stack exchange,提问作者ben
相关产品推荐
相关产品推荐

