关于时区:Qt到QML的转换:QDateTime->日期

Qt to QML conversion: QDateTime -> date

所以我要向QML发送一个QDateTime以便显示它并进行一些检查(理想情况下,我希望能够使用所有的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一侧?
谢谢!!


遵循@Pedro的建议(我不知道如何正确标记您的身份...),我使用了moment.js以及moment-timezone.js,因此可以将任何日期引用到所需的时区。对于任何有兴趣的人,这就是我的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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() +"\
"
              + getDateWithTimeZone(customDate,"Europe/Paris").toString()
    }
}

提供以下输出:

enter image description here


javascript Date类非常有限。它具有内部UTC时间/日期,并且不允许更改时区。默认情况下,它还会显示转换为您所观察到的本地时区。

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

无论如何,最好的方法似乎是尽可能避免QML中的Date对象,而改用其他方法。 javascript的替代方案,或者甚至更好的方法是,您自己的封装QDateTime的C ++类作为QML的上下文属性公开,并提供您在QML方面需要的任何方法。像这样的示例Qt官方文档中的ApplicationData。