字符串时间转datetime存入Firebase报格式不匹配错误如何解决
报错原因
你调用datetime.strptime时传入的格式字符串,和实际时间字符串的结构完全不匹配:
- 待转换的时间字符串
'2022-06-29 07:55:28'用-分隔年、月、日,后半段是24小时制的时、分、秒,没有AM/PM标识 - 你写的格式串
'%Y %m %d %I:%M:%S%p'用空格分隔年、月、日,按12小时制解析小时,还要求末尾带AM/PM后缀,和输入结构完全对应不上,所以抛出值错误。
解决方案
不需要使用momentjs或其他第三方时间处理工具,Python标准库自带的datetime模块加上Firebase SDK的内置方法就可以完成转换,Firebase/Firestore支持直接存入原生datetime对象,会自动转换为库内标准的Timestamp格式。
- 修正格式串完成解析
匹配输入字符串的正确格式串为'%Y-%m-%d %H:%M:%S',注意几个和你之前写错的点:- 年、月、日之间的分隔符要写
-,和输入保持一致,不能用空格 - 24小时制的小时要用格式符
%H,不能用12小时制的%I - 输入没有AM/PM标识,不需要加
%p
示例代码:
from datetime import datetime from firebase_admin import firestore time_str = '2022-06-29 07:55:28' # 解析为原生datetime对象 dt = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S') # 直接存入Firestore即可,SDK自动转成Timestamp db.collection('your_collection').document('doc_id').set({ "time_field": dt, # 如果不需要固定为字符串对应的时间,优先用服务端时间戳,避免客户端时钟偏差 "server_time": firestore.SERVER_TIMESTAMP }) - 年、月、日之间的分隔符要写
- 更简便的解析方式(Python 3.7+可用)
你的时间字符串符合ISO 8601格式,可以直接用datetime.fromisoformat方法解析,不需要手写格式串,减少格式写错的概率:dt = datetime.fromisoformat(time_str)
补充说明
如果业务场景不需要强制存入字符串对应的固定时间,优先使用firestore.SERVER_TIMESTAMP取值,这个值由Firebase服务端生成,不会受客户端本地时间不准、时区配置错误的影响,可靠性更高。
内容的提问来源于stack exchange,提问作者Adeena Lathiya
相关产品推荐
相关产品推荐

