PyQt6中带时区的日期字符串与QDateTime互转问题求助
解决PyQt6中QDateTime时区处理问题
要实现将字符串"20230329 15:40:00 US/Eastern"解析后还原为原字符串的需求,核心要解决两个问题:正确绑定时区到解析的时间和避免错误的时区转换,以下是修正后的方案:
错误原因分析
- TEST1的问题:不需要将时区字符串转成
QByteArray,PyQt6的QTimeZone直接支持字符串形式的时区ID(如"US/Eastern");更关键的是,setTimeZone()是转换时区(将当前时间从原时区转到目标时区),而非将解析的时间视为目标时区的时间,这会导致时间值偏移。 - TEST2的问题:
setTimeZone()参数需要QTimeZone对象,不能直接传字符串。
修正后的代码
import re from PyQt6.QtCore import QDateTime, Qt, QTimeZone PATT_TIME_BASE = re.compile(r"\d{8} \d{2}:\d{2}:\d{2} \w+(/\w+)?") for date_str in ["Wed Mar 26 22:37:40 2019 GMT-08","20230329 15:40:00 US/Eastern"]: if PATT_TIME_BASE.match(date_str): s = date_str.rsplit(" ", 1) date_part = s[0] tz_id = s[1] # 创建对应时区对象,验证合法性 qzt = QTimeZone(tz_id) if not qzt.isValid(): print(f"无效时区:{tz_id}") continue # 解析日期时直接指定时区,将时间视为该时区的本地时间 date_object = QDateTime.fromString(date_part, "yyyyMMdd HH:mm:ss", qzt) # 格式化为原字符串格式:日期部分 + 原始时区ID date_str_2 = f"{date_object.toString('yyyyMMdd HH:mm:ss')} {tz_id}" print("List:", s) print("(2) ", date_str, " - ", date_object, " - ", date_str_2) else: date_object = QDateTime.fromString(date_str) date_str_2 = date_object.toString() print("(1) ", date_str, " - ", date_object, " - ", date_str_2)
关键说明
- 正确创建时区对象:直接用
QTimeZone(tz_id)即可,无需转换为QByteArray,同时可通过isValid()验证时区ID是否合法。 - 解析时绑定时区:使用
QDateTime.fromString()的第三个参数指定时区,这样解析出的时间会被直接标记为该时区的本地时间,不会发生时区转换导致的时间偏移。 - 还原原字符串格式:由于Qt的
toString()格式符无法直接输出"US/Eastern"这类时区ID(仅能输出时区缩写或长描述),因此直接拼接原始时区ID即可保证结果与输入一致。
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

