是否可以在不丢失时区的情况下从 QDateTime 转换为 python 日期时间?

问题描述 投票:0回答:1

我正在尝试将 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 日期时间对象。然而,转换似乎删除了时区信息。解决方法是在转换后重新附加时区。这似乎是一种复杂的方法。有没有一种方法可以在不丢失时区的情况下进行转换?

python pyside6 qdatetime
1个回答
0
投票

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
对象来实现。

© www.soinside.com 2019 - 2024. All rights reserved.