Qt 到 QML 的转换:QDateTime -> 日期

Qt to QML conversion: QDateTime -> date

所以我将 QDateTime 发送到 QML 以显示它并进行一些检查(理想情况下我希望能够使用所有 javascript 日期函数,如 getTime()、getMonth()。 ..),我意识到如果我发送:

QDateTime(2019-10-30 11:15:00.000 CET Qt::TimeZone Europe/Amsterdam )

然后我在 QML 上读取日期,我得到的是本地时区的时间,而不是 QDateTime 上设置的时间...

Wed Oct 30 06:15:00 2019 GMT-0400 (NY timezone)

有什么方法可以将时区保留在 QML 端吗? 谢谢!!

javascript Date class 非常有限。它拥有一个内部 UTC time/date 并且不允许更改时区。它还默认显示转换为本地时区,这是您观察到的。

有一个 javascript Moment library 支持时区,以缓解 Date 的一些缺点,但它与 QML、IIRC 不完全兼容。

无论如何,最好的方法似乎是尽可能避免使用 QML 中的 Date 对象,而是使用其他对象。 javascript 替代方案,甚至更好,您自己的 C++ class 封装 QDateTime,作为上下文 属性 公开给 QML,以及您在 QML 端需要的任何方法。来自 Qt 官方文档的类似内容 example ApplicationData

@Pedro's advice (I don't know how to tag you properly...), I used moment.js as well as moment-timezone.js 之后,这样我就可以将任何日期引用到我想要的时区。对于任何感兴趣的人,我就是这样做的:

import QtQuick 2.9
import "./moment.js" as Moment
import "./moment-timezone-with-data.js" as MomentTimezone

Item {
    anchors.fill: parent
    property date customDate: new Date(); // local timezone is "America/New_York"

    function getDateWithTimeZone(date, timeZone) {
        var momentDate = moment(new Date(date));
        var momentDateTz = momentDate.tz(timeZone);
        return momentDateTz;
    }

    Text {
        anchors.centerIn: parent
        text: customDate.toLocaleString() + "\n"
              + getDateWithTimeZone(customDate, "Europe/Paris").toString()
    }
}

给出以下输出: