gpt4 book ai didi

c++ - Qt。时区和 addSecs 的 QDateTime 不可预测的行为

转载 作者:行者123 更新时间:2023-11-30 03:36:33 28 4
gpt4 key购买 nike

我不知道哪里出了问题。

QTimeZone zone1(QTimeZone("Europe/Moscow"));
QTimeZone zone2(QTimeZone("Asia/Yekaterinburg"));
QDateTime test = QDateTime(QDate(2016, 11, 11), QTime(15,00), zone1);
qDebug() << test;//QDateTime(2016-11-11 15:00:00.000 MSK Qt::TimeSpec(TimeZone) Europe/Moscow)
test = test.addSecs(5*60);
qDebug() << test;//QDateTime(2016-11-11 15:05:00.000 MSK Qt::TimeSpec(TimeZone) Europe/Moscow)

这在 Europe/Moscow(+3) 上工作正常,但是当我将时区更改为 Asia/Yekaterinburg(+5) 时,它工作起来很奇怪

QTimeZone zone2(QTimeZone("Asia/Yekaterinburg"));
QDateTime test = QDateTime(QDate(2016, 11, 11), QTime(15,00), zone2);
qDebug() << test;//QDateTime(2016-11-11 15:00:00.000 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)
test = test.addSecs(5*60);
qDebug() << test;//QDateTime(2016-11-11 10:05:00.000 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)

最佳答案

奇怪的是,我使用 Qt 5.6.0 和这个调整后的示例重现了它。

QDateTime test1 = QDateTime(QDate(2016, 11, 11), QTime(15, 00), QTimeZone("Europe/Moscow"));
QDateTime test2 = QDateTime(QDate(2016, 11, 11), QTime(15, 00), QTimeZone("Asia/Yekaterinburg"));
QDateTime test3 = QDateTime(QDate(2016, 11, 11), QTime(15, 00), QTimeZone("Europe/Berlin"));
qDebug() << test1;
qDebug() << test2;
qDebug() << test3;
qDebug() << test1.addSecs(5*60);
qDebug() << test2.addSecs(5*60);
qDebug() << test3.addSecs(5*60);

输出:

QDateTime(2016-11-11 15:00:00.000 RTZ 2 Qt::TimeSpec(TimeZone) Europe/Moscow)
QDateTime(2016-11-11 15:00:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)
QDateTime(2016-11-11 15:00:00.000 MEZ Qt::TimeSpec(TimeZone) Europe/Berlin)
QDateTime(2016-11-11 18:05:00.000 RTZ 2 Qt::TimeSpec(TimeZone) Europe/Moscow)
QDateTime(2016-11-11 20:05:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)
QDateTime(2016-11-11 15:05:00.000 MEZ Qt::TimeSpec(TimeZone) Europe/Berlin)
QDateTime(2016-11-11 18:05:00.000 RTZ 2 Qt::TimeSpec(TimeZone) Europe/Moscow)

请注意,我添加了另一个时区,这是我的本地时区。您可能注意到这是有效的时区 (Europe/Berlin)。

接下来要做的是偏移量分析。您会看到以下偏移量:

  • 欧洲/莫斯科:+3h
  • 亚洲/叶卡捷琳堡:+5h

看一些time zone map人们可能会注意到两个区域之间的偏移正好是 2h。那么 +3h 从何而来?

不用说,我又进行了一次测试。

QDateTime dt = QDateTime(QDate(2016, 11, 11), QTime(15, 00), QTimeZone("UTC"));
qDebug() << dt;
qDebug() << dt.addSecs(5*60);
qDebug() << dt.addSecs(5*60).toTimeZone(QTimeZone("Asia/Yekaterinburg"));

输出:

QDateTime(2016-11-11 15:00:00.000 UTC   Qt::TimeSpec(TimeZone) UTC)
QDateTime(2016-11-11 15:05:00.000 UTC Qt::TimeSpec(TimeZone) UTC)
QDateTime(2016-11-11 20:05:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)

我们开始吧:Qt 似乎没有在计算之前将时区转换为 UTC,而是将其用作 UTC,这导致具有相应偏移量的后移。

但是等等...

QDateTime dt = QDateTime(QDate(2016, 11, 11), QTime(15, 00), Qt::UTC);
qDebug() << dt.toLocalTime();
qDebug() << dt.toTimeZone(QTimeZone("Asia/Yekaterinburg"));
qDebug() << dt.toUTC();

输出:

QDateTime(2016-11-11 16:00:00.000 MEZ   Qt::TimeSpec(LocalTime))
QDateTime(2016-11-11 20:00:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)
QDateTime(2016-11-11 15:00:00.000 UTC Qt::TimeSpec(UTC))

现在看起来,如果构造函数获得一个时区,它会假定它是 UTC,而不是提供的时区。如果将其省略,Qt 会占用本地时间,这是显而易见的。

因为它没有记录在哪里 usedbe这对我来说似乎是一个错误。


长话短说,怎么办?

如果适用,尝试提供本地时间或 UTC 时间,将它们转换为 UTC,用它们计算,然后格式化为所需的输出。

QDateTime dt = QDateTime(QDate(2016, 11, 11), QTime(10, 00), Qt::UTC);
qDebug() << dt.toTimeZone(QTimeZone("Asia/Yekaterinburg"));
qDebug() << dt.addSecs(5*60).toTimeZone(QTimeZone("Asia/Yekaterinburg"));

输出:

QDateTime(2016-11-11 15:00:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)
QDateTime(2016-11-11 15:05:00.000 RTZ 4 Qt::TimeSpec(TimeZone) Asia/Yekaterinburg)

关于c++ - Qt。时区和 addSecs 的 QDateTime 不可预测的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40617470/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com