我从这样的字符串构造一个QDateTime:
QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
我知道date
是UTC,因为这是它的存储方式。但是,当我想向用户显示此日期时,它应该在用户的本地时区。 date.toLocalTime()
看起来很有希望,但它会返回完全相同的日期!
如何将date
转换为系统的本地时间以显示给用户?
以下是一些失败:
#include <QtCore/QCoreApplication>
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
QDateTime local = date.toLocalTime();
qDebug() << "utc: " << date;
qDebug() << "local: " << local.toString();
qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate);
return a.exec();
}
输出:
utc: QDateTime("Mon Oct 25 10:28:58 2010")
local: "Mon Oct 25 10:28:58 2010"
hax: "Monday, October 25, 2010 10:28:58 AM"
答案 0 :(得分:23)
QDateTime知道它是UTC还是本地时间。例如:
QDateTime utc = QDateTime::currentDateTimeUtc();
QDateTime local = QDateTime::currentDateTime();
local.secsTo(utc) // zero; these dates are the same even though I am in GMT-7
我们需要告诉date
它是date.setTimeSpec(Qt::UTC)
的UTC日期时间:
#include <QtCore/QCoreApplication>
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
date.setTimeSpec(Qt::UTC);
QDateTime local = date.toLocalTime();
qDebug() << "utc: " << date;
qDebug() << "local: " << local.toString();
qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate);
return a.exec();
}
输出:
utc: QDateTime("Mon Oct 25 10:28:58 2010")
local: "Mon Oct 25 03:28:58 2010"
hax: "Monday, October 25, 2010 3:28:58 AM"
我在GMT-7,所以这是对的。
答案 1 :(得分:0)
使用QDateTime::toString()没有给出预期的结果吗?
也许您可以尝试使用QDateTime::toString(Qt::SystemLocaleLongDate)
或QDateTime::toString(Qt::SystemLocaleShortDate)
的其他格式。
否则,我会尝试使用QLocale::dateTimeFormat()将本地格式设为QString
,然后将此字符串用作QDateTime::toString()的格式参数,但我不认为会改变任何事情。