【发布时间】:2014-03-25 10:29:14
【问题描述】:
有谁知道将时区包含在 QDateTime 的 ISO 字符串表示中的更简洁的方法?
我应该能够使用以下内容:
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
但这总是以 UTC 格式输出:
2014-02-24T01:29:00Z
目前,我解决此问题的方法是通过显式设置偏移量来强制 TimeSpec 为 Qt::offsetFromUtc,这是我最初从 QDateTime 获得的。
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
这给出了最初的预期:
2014-02-24T01:29:00+02:00
有谁知道如何以更简洁的方式执行此操作,或者必须将其记录为错误?
编辑:我正在使用 Qt5.2.1
更新:
下面的小程序说明了我的意思:
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
int main(int argc, int argv){
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
qDebug() << QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
return 0;
}
生成以下输出:
"2014-02-24T10:20:49"
"2014-02-24T08:20:49Z"
"2014-02-24T10:20:49+02:00"
最后一行是预期的。请注意,第二次已转换为 UTC,这不是我们想要的。
【问题讨论】:
-
另外,我的机器上的输出不同,所以我自己什至无法重现确切的问题:
"2014-02-24T08:51:07" "2014-02-24T08:51:07Z" "2014-02-24T08:51:07Z" -
这个问题没有改变它的意思,也许你对这个问题的理解已经改变了。简而言之,我问是否有更简洁的方法来获得所需的结果,或者我是否应该记录一个错误。我认为我对此非常清楚。
-
您使用的是什么版本的 Qt。我正在使用 5.2.1。我提供的代码是我实际编译和运行的代码,而不仅仅是我脑海中的想法。结果是我的机器生成的实际结果,因此它有资格作为 SSCCE。感谢拉斯洛的意见。我会将您的答案标记为正确。尽管答案对我没有帮助,但我会假设您的代码是 Qt 应该如何工作的,我将使用 Digia 记录一个错误。
-
是的,我在 Archlinux 上使用相同的,如果这很重要的话。不确定它是否与我的伦敦时区有关,所以没有 +/- 小时差异。
-
我在 Windows 8 上编译,但我认为这不会有太大的不同。您的时区是伦敦,确实会对您的结果产生很大影响,因为您在 UTC。我的时区是 SAST (UTC+2)。您可以从测试输出中看到 QDateTime::toTimeSpec(Qt::OffsetFromUTC) 将我的本地时间转换为 UTC 时间,即将时间提前 2 小时。对你来说,这种转变不会发生,因为你已经在 UTC 时区。
标签: c++ qt qtcore qdatetime qdate