2

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

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

然后我阅读了 QML 上的日期,我得到了当地时区的时间,而不是 QDateTime 上的时间......

2019 年 10 月 30 日星期三 06:15:00 GMT-0400(纽约时区)

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

4

2 回答 2

0

按照@Pedro的建议(我不知道如何正确标记您...),我使用了 moment.jsmoment-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()
    }
}

给出以下输出:

在此处输入图像描述

于 2019-10-22T20:38:44.577 回答
0

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

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

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

于 2019-10-21T21:35:46.290 回答