【问题标题】:Qt to QML conversion: QDateTime -> dateQt 到 QML 的转换:QDateTime -> 日期
【发布时间】:2019-10-21 16:01:21
【问题描述】:

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

【问题讨论】:

  • 如何在 QML 端显示日期/时间值?或者 IOW,你怎么知道时区是错误的?我想知道它是否只是默认转换为当地时间进行显示。例如。 Qt.formatDateTime() 的默认值是当地时间。虽然无论如何我都不明白 15 分钟的区别。
  • console.log(date) 打印出“Wed Oct 30 06:15:00 2019 GMT-0400”。如果我想比较小时数或仅使用与本地不同的自定义时区的时间进行一些检查,那么这并不是那么简单...... 15 分钟的差异是我的错,对不起,我会编辑它
  • 似乎是时区信息在“翻译”到 QML 时丢失了。我通过在您的示例中设置contextProperty()QDateTime 来尝试它,但这可能并不重要它是如何传递的。docs 在这个主题上也相当混乱。 :(

标签: qt timezone qml qdatetime


【解决方案1】:

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

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

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

【讨论】:

  • 好的,我会尝试创建自己的类来支持我需要的 Date 函数...或者在 qt 端执行所有逻辑并将值作为字符串发送...谢谢!
【解决方案2】:

按照@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()
    }
}

给出以下输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 2023-03-14
    • 2016-07-07
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多