PostgreSQL添加时区后Python strptime解析时间字符串报错求助
解决带时区的PostgreSQL datetime字符串解析ValueError问题
这个问题的核心是你用错了时区格式匹配符!
你原来用的 %Z 是用来匹配时区名称/缩写的(比如 CET、UTC 这类),但你的时间字符串里的时区是偏移量格式(+02:00),这时候应该用小写的 %z 来匹配。
直接修改格式字符串解决
把你的解析格式从 '%Y-%m-%d %H:%M:%S.%f+%Z' 改成 '%Y-%m-%d %H:%M:%S.%f%z' 就能正常解析了:
from datetime import datetime time_str = '2018-05-02 11:52:26.108540+02:00' dt = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S.%f%z') print(dt) # 输出:2018-05-02 11:52:26.108540+02:00
注意:%z 会自动匹配带符号的时区偏移量(包括 +HH:MM 或 -HH:MM),所以不需要在格式里额外加 + 符号。
更简便的方法:用fromisoformat(Python 3.7+)
如果你的Python版本在3.7及以上,推荐直接用 datetime.fromisoformat() 方法,它可以直接解析这种ISO标准的带时区时间字符串,完全不用手动写格式:
from datetime import datetime time_str = '2018-05-02 11:52:26.108540+02:00' dt = datetime.fromisoformat(time_str) print(dt)
这个方法对各种ISO格式的时间字符串兼容性更好,还能省掉写格式字符串的麻烦。
针对JSON请求的处理建议
如果是在处理JSON请求时遇到这个问题,可以自定义一个JSON解码器,自动把字符串转换成带时区的datetime对象:
import json from datetime import datetime def datetime_decoder(obj): if isinstance(obj, str): try: return datetime.fromisoformat(obj) except ValueError: # 如果不是标准时间格式,返回原字符串 pass return obj # 示例:解析包含带时区时间的JSON json_request = '{"event_time": "2018-05-02 11:52:26.108540+02:00"}' parsed_data = json.loads(json_request, object_hook=datetime_decoder) print(type(parsed_data['event_time'])) # 输出:<class 'datetime.datetime'>
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

