Qt转QML:QDateTime -> 日期

3

我想在QML中显示并进行一些检查,所以我将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端保留时区? 谢谢!


你是如何在QML界面上显示日期/时间值的?换句话说,你是怎么知道时区有问题的?我想知道是否默认将其转换为本地时间进行显示。例如,默认情况下Qt.formatDateTime()使用的是本地时间。虽然我无论如何都不理解15分钟的差异。 - undefined
console.log(date) 打印出 "Wed Oct 30 06:15:00 2019 GMT-0400"。如果我想要比较小时或者对只有自定义时区的时间进行一些检查,与本地时区不同,那就不是那么直接了... 这个15分钟的差异是我的错,我会编辑它,抱歉。 - undefined
似乎在将时区信息传递到QML时丢失了。我尝试通过像您的示例中那样设置一个contextProperty()和一个QDateTime来解决,但是无论如何传递进去似乎都没有关系。文档对此主题也相当令人困惑。:( - undefined
2个回答

0

javascript Date类相当有限。它保存一个内部的UTC时间/日期,不允许更改时区。默认情况下,它显示为本地时区,这就是你观察到的情况。

有一个带有时区支持的javascript Moment库,可以减轻一些Date的缺点,但它与QML不完全兼容,如果我没记错的话。

无论如何,在QML中尽量避免使用Date对象,而是使用其他替代方案。可以是javascript的替代方案,或者更好的是,你自己的C++类,将QDateTime封装为上下文属性暴露给QML,在QML一侧提供所需的方法。类似于官方Qt文档中的示例ApplicationData


好的,我会尝试创建自己的类来支持我从日期中所需的功能...或者在Qt端处理所有逻辑并将值作为字符串发送...谢谢! - undefined

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()
    }
}

这将产生以下输出:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接