我正在尝试将 pyside6 中的 QDateTime 对象转换为 python 日期时间对象。考虑以下代码:
from PySide6.QtCore import Qt, QDateTime, QTimeZone
import datetime
qdatetime = QDateTime.currentDateTime()
print(qdatetime.offsetFromUtc())
qdatetime.setTimeZone(QTimeZone.UTC)
print(qdatetime.toString(Qt.ISODate))
print(qdatetime.offsetFromUtc())
pt = qdatetime.toPython()
print(pt)
print(pt.tzinfo)
ptt = pt.replace(tzinfo = datetime.timezone.utc)
print(ptt.tzinfo)
print(ptt)
输出如下所示:
3600
2025-01-06T18:56:43Z
0
2025-01-06 18:56:43.251000
None
UTC
2025-01-06 18:56:43.251000+00:00
显然我可以将时区附加到 QDateTime 对象和 python 日期时间对象。然而,转换似乎删除了时区信息。解决方法是在转换后重新附加时区。这似乎是一种复杂的方法。有没有一种方法可以在不丢失时区的情况下进行转换?
PySide 的
toPython()
函数源自 PyQt4 的原始 toPyDateTime()
函数,当时 QDateTime 类没有提供时区信息。
即使使用更新的 PyQt5/6 实现,行为也没有改变,该实现没有更新以反映自 Qt 5.2 以来引入的时区信息。
由于各种原因,包括 Qt 和 Python 之间的不同实现,这可能不会作为一个选择来实现,而且我真诚地怀疑它会实现。这些辅助函数适用于简单的情况,更复杂的情况可能需要自定义实现。
在保留偏移量的同时正确转换 QDateTime 的一种方法可能是仅使用
datetime.fromisoformat()
的显式日期时间字符串并添加原始 QDateTime 的 UTC 偏移量:
from PyQt6.QtCore import QDateTime
from datetime import datetime
def datetimeQt2Py(qDateTime):
s = qDateTime.offsetFromUtc()
if not s:
return datetime.fromisoformat(
qDateTime.toString(Qt.DateFormat.ISODate))
sign = '+' if s > 0 else '-'
s = abs(s)
h = m = 0
if s >= 60:
m = s // 60
s %= 60
if m >= 60:
h = m // 60
m %= 60
return datetime.fromisoformat(qDateTime.toUTC().toString(
f'yyyy-MM-ddTHH:mm:ss{sign}{h:02}:{m:02}:{s:02}'))
now = QDateTime.currentDateTime()
dt = datetimeQt2Py(now)
print(now)
print(dt)
print(dt.tzinfo)
上面显然不会保留时区名称,也不会保留任何夏令时信息。所有这些都可以通过动态创建
datetime.tzinfo
对象来实现。