Конвертировать QDateTime в UTC в местное системное время - PullRequest
13 голосов
/ 27 октября 2010

Я создаю 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"

Ответы [ 2 ]

24 голосов
/ 27 октября 2010

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, что это время в формате 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();
}

Вывод:

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, так что это правильно.

0 голосов
/ 27 октября 2010

Использование QDateTime :: toString () не дает ожидаемых результатов?

Может быть, вы можете попробовать использовать другой формат с QDateTime::toString(Qt::SystemLocaleLongDate) или QDateTime::toString(Qt::SystemLocaleShortDate).

В противном случае я попытался бы использовать QLocale :: dateTimeFormat () , чтобы получить локальный формат как QString, а затем использовать эту строку в качестве параметра формата QDateTime :: toString (), но я не думаю, что это что-то изменит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...