将UTC中的QDateTime转换为本地系统时间

and*_*wrk 13 c++ qt qt4

我从这样的字符串构造一个QDateTime:

QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
Run Code Online (Sandbox Code Playgroud)

我知道这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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

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"
Run Code Online (Sandbox Code Playgroud)

and*_*wrk 24

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
Run Code Online (Sandbox Code Playgroud)

我们需要告诉date它是一个UTC日期时间date.setTimeSpec(Qt::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();
}
Run Code Online (Sandbox Code Playgroud)

输出:

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"
Run Code Online (Sandbox Code Playgroud)

我在GMT-7,所以这是对的.