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

Qt到QML转换:QDateTime->;日期,qt,timezone,qml,qdatetime,Qt,Timezone,Qml,Qdatetime,因此,我将QDateTime发送给QML,以便显示它并进行一些检查(理想情况下,我希望能够使用所有javascript日期函数,如getTime()、getMonth()…),并且我意识到如果我发送: QDateTime(2019-10-30 11:15:00.000欧洲中部时间:时区欧洲/阿姆斯特丹) 然后我读取QML上的日期,我得到本地时区上的时间,而不是QDateTime上设置的时间 10月30日星期三06:15:00 2019 GMT-0400(纽约时区) 有没有办法把时区保留在QML端

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

QDateTime(2019-10-30 11:15:00.000欧洲中部时间:时区欧洲/阿姆斯特丹)

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

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

有没有办法把时区保留在QML端? 谢谢

这门课相当有限。它包含内部UTC时间/日期,不允许更改时区。默认情况下,它还显示转换为您观察到的本地时区

有一个支持时区的javascript,可以缓解一些日期缺陷,但它与QML、IIRC不完全兼容

无论如何,最好的方法似乎是尽可能避免QML中的日期对象,而是使用其他方法。无论是JavaScript替代品,还是更好的是,您自己封装的C++类,将QDATEATE封装为QML的上下文属性,并使用QML方面所需的任何方法。类似于Qt官方文档中的内容。

按照的建议(我不知道如何正确标记您…),我使用了以及,以便我可以将任何日期引用到我想要的时区。对任何感兴趣的人来说,我就是这样做的:

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()
    }
}
这将提供以下输出:


如何在QML端显示日期/时间值?或者,你怎么知道时区错了?我想知道它是否只是在默认情况下转换为本地时间来显示。例如,
Qt.formatDateTime()
的默认值是本地时间。尽管我不理解在任何情况下15分钟的差异。console.log(date)打印出“Wed Oct 30 06:15:00 2019 GMT-0400”。如果我想比较小时数,或者只使用与本地时区不同的自定义时区的时间进行一些检查,那么这并不是那么简单。。。15分钟的差异是我的错,我将对其进行编辑,很抱歉,似乎时区信息在“翻译”到QML时丢失了。我通过设置
contextProperty()
QDateTime
来尝试它,就像在您的示例中一样,但它可能与如何传入无关。在这个问题上,专家们也相当困惑(好的,我将尝试创建我自己的类来支持我从Date开始需要的函数…或者在qt端执行所有逻辑并将值作为字符串发送…谢谢!