ISO格式时间字符串转datetime加1小时再转回字符串报错求助
解决ISO时间字符串加1小时的格式匹配问题
你的代码报错是因为格式字符串构造错误,无法匹配带毫秒段的时间字符串。原代码中('%Y-%m-%dT%H:%M:%S.%f')[:-3]会截断掉表示微秒的%f部分,最终格式变成%Y-%m-%dT%H:%M:%SZ,但你的时间字符串包含.529毫秒部分,导致匹配失败。
下面提供两种可行的解决方法:
方法一:修正格式字符串
直接使用包含毫秒段的格式匹配字符串,解析后再按要求转回原格式:
from datetime import datetime, timedelta timestamp = '2022-12-23T16:21:14.529Z' # 匹配带3位毫秒和末尾Z的格式 format_pattern = '%Y-%m-%dT%H:%M:%S.%fZ' # 字符串转datetime to_datetime = datetime.strptime(timestamp, format_pattern) # 加1小时 add1_hour = to_datetime + timedelta(hours=1) print(type(add1_hour), add1_hour) # datetime转回原格式字符串 to_string = add1_hour.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z' print(type(to_string), to_string)
注:%f会匹配6位微秒,strptime会自动将输入的3位毫秒补零为6位微秒,不影响解析结果;转回字符串时截断后3位,还原为3位毫秒格式。
方法二:使用fromisoformat简化操作(Python 3.10+)
Python 3.10及以上版本的fromisoformat支持解析带时区的ISO字符串,只需简单处理Z符号即可:
from datetime import datetime, timedelta timestamp = '2022-12-23T16:21:14.529Z' # 将Z替换为UTC时区标识+00:00,适配fromisoformat解析 to_datetime = datetime.fromisoformat(timestamp.replace('Z', '+00:00')) # 加1小时 add1_hour = to_datetime + timedelta(hours=1) print(type(add1_hour), add1_hour) # 转回带Z的ISO格式字符串 to_string = add1_hour.isoformat(timespec='milliseconds').replace('+00:00', 'Z') print(type(to_string), to_string)
内容的提问来源于stack exchange,提问作者PythonNoob
相关产品推荐
相关产品推荐

