2010-10-27 16 views
8

ich eine QDateTime aus einem String wie folgt konstruieren:Wandle QDateTime in UTC zu lokalen Systemzeit

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

Ich weiß, dass date in UTC ist denn das ist die Art und Weise ist es gespeichert ist. Aber wenn ich dieses Datum dem Benutzer anzeigen möchte, sollte es in der lokalen Zeitzone des Benutzers sein. sieht vielversprechend aus, aber es gibt genau das gleiche Datum zurück!

Wie konvertiere ich date in die lokale Zeit des Systems, um sie dem Benutzer anzuzeigen?

Hier sind einige weitere Ausfälle:

#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(); 
} 

Ausgang:

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" 

Antwort

17

QDateTime weiß, ob es UTC oder Ortszeit ist. Zum Beispiel:

QDateTime utc = QDateTime::currentDateTimeUtc(); 
QDateTime local = QDateTime::currentDateTime(); 

local.secsTo(utc) // zero; these dates are the same even though I am in GMT-7 

Wir brauchen date zu sagen, dass es sich um eine UTC-Datum Zeit mit date.setTimeSpec(Qt::UTC) ist:

#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(); 
} 

Ausgang:

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" 

Ich bin in GMT-7, so Dies ist richtig.

0

Nutzen QDateTime::toString() nicht geben Sie Ergebnisse zu erwarten?

Vielleicht könnten Sie versuchen, ein anderes Format mit QDateTime::toString(Qt::SystemLocaleLongDate) oder QDateTime::toString(Qt::SystemLocaleShortDate) zu verwenden.

Ansonsten würde ich versuchen QLocale::dateTimeFormat() zu verwenden, um das lokale Format als QString zu bekommen und dann diese Zeichenfolge als Format verwenden Parameter von QDateTime::toString(), aber ich glaube nicht, dass irgendetwas ändern wird.

+0

versuchte es, hat nicht funktioniert. Siehe Bearbeitungen zur Frage – andrewrk