2014-02-23 15 views
8

Kennt jemand eine sauberere Möglichkeit, die Zeitzone in die ISO-Zeichenfolgendarstellung einer QDateTime aufgenommen zu bekommen?Qt ISODate formatiert Datum/Uhrzeit einschließlich Zeitzone

ich soll in der Lage sein, nur die folgenden verwenden:

qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate); 

aber das kommt immer heraus im UTC-Format:

2014-02-24T01:29:00Z 

Derzeit ist die Art, wie ich bin rund um diese Arbeit zu zwingen Die TimeSpec soll Qt :: offsetFromUtc sein, indem ich explizit den Offset festlege, den ich ursprünglich von QDateTime bekomme.

QDateTime now = QDateTime::currentDateTime(); 
int offset = now.offsetFromUtc(); 
now.setOffsetFromUtc(offset); 
qDebug() << now.toString(Qt::ISODate); 

Dies gibt, was ursprünglich erwartet wurde:

2014-02-24T01:29:00+02:00 

Wer weiß, wie dies in einer sauberen Art und Weise zu tun, oder dies als Fehler protokolliert werden müssen?

EDIT: Ich bin mit Qt5.2.1

UPDATE:

Das folgende kleine Programm zeigt, was ich meine:

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

Die folgende Ausgabe erzeugt:

"2014-02-24T10:20:49" 
"2014-02-24T08:20:49Z" 
"2014-02-24T10:20:49+02:00" 

Die letzte Zeile ist die erwartete Zeile. Bitte beachten Sie, dass das zweite Mal in UTC konvertiert wurde, was nicht gewünscht ist.

+0

Auch die Ausgabe ist auf meiner Maschine anders, so dass ich nicht einmal das genaue Problem reproduzieren kann: '" 2014-02-24T08: 51: 07 " " 2014-02- 24T08: 51: 07Z " " 2014-02-24T08: 51: 07Z "' – lpapp

+0

Die Frage hat ihre Bedeutung nicht geändert, vielleicht hat sich Ihr Verständnis der Frage geändert. Kurz gesagt, ich fragte, ob es einen saubereren Weg gäbe, um das gewünschte Ergebnis zu erzielen, oder ob ich einen Fehler protokollieren sollte. Ich dachte, ich wäre mir da sehr klar. – RobbieE

+0

Welche Version von Qt verwenden Sie? Ich benutze 5.2.1. Der Code, den ich dort eingegeben habe, ist Code, den ich tatsächlich kompiliert und ausgeführt habe, nicht nur in meinem Kopf gedacht. Die Ergebnisse sind tatsächliche Ergebnisse, die meine Maschine generiert hat, daher qualifiziert es sich als SSCCE. Danke Laszlo für Ihre Eingabe.Ich werde deine Antwort als richtig markieren. Obwohl die Antwort mir nicht hilft, werde ich annehmen, dass Ihr Code ist, wie Qt funktionieren sollte und ich einen Fehler mit Digia protokollieren soll. – RobbieE

Antwort

4

Dies war nicht vor 5.2 vorhanden, aber es wurde dort integriert. Es scheint, dass Sie die Syntax falsch obwohl bekommen, weil es so sein sollte:

QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate) 

gemäß den corresponding bugreport. Beachten Sie, dass toTimeSpec(Qt::OffsetFromUTC) Anruf in der Mitte.

+0

Das war das erste, was ich ausprobiert habe. Es stellt sich heraus, dass jedes Mal, wenn Sie die Zeitangabe auf "Qt :: OffsetFromUTC" setzen, die internen Offsetminuten gelöscht werden. Später in der Funktionsausführung, weil der Offset 0 ist, wird die Zeitangabe in "Qt :: UTC" geändert, was zu "2014-02-24T08: 23Z" – RobbieE

+0

führt. Meine ursprüngliche Frage fragt, ob es eine sauberere Möglichkeit gibt, das ISO-Datum zu erhalten mit der Zeitzone Teil enthalten oder wenn dies ein Fehler ist. Du gibst mir zwar eine sauberere Methode, aber das gibt mir nicht die richtige Ausgabe, verschiebt meine Zeitzone auf UTC. Wenn Sie die richtige Ausgabe erhalten, vermute ich, dass wir nicht die gleiche Nebenversion verwenden. Wie gesagt, ich benutze 5.2.1. Vielleicht ist es ein Fehler, der eingeführt wurde. Ich werde deine Antwort akzeptieren, aber ich werde es auch als Fehler bei Digia protokollieren. – RobbieE

+0

@RobbieE: Sie haben noch keinen [in sich geschlossenen Testfall] (http://sscce.org) bereitgestellt. Selbst Digia würde das verlangen, denke ich. Mit Arbeiten meinte ich, dass das Drucken dieser Zeile das richtige Ergebnis liefert, wie es in einer leeren Hauptfunktion erwartet wird, genau so, wie Sie es scheinbar gewünscht haben. – lpapp

1

Dies scheint mit Millisekunden-Genauigkeit und die Erhaltung der Zeitzoneninformationen zu arbeiten,:

#include <QDebug> 
#include <QTimeZone> 

QString datetimeToIsoMs(const QDateTime& dt) 
{ 
    // An ISO-8601 format preserving millisecond accuracy and timezone. 
    // Equivalent in moment.js: thing.format("YYYY-MM-DDTHH:mm:ss.SSSZ") 
    // Example: '2016-06-02T10:04:03.588+01:00' 
    // Here we also allow 'Z' for UTC. 

    // In Qt, BEWARE: 
    //  dt; // QDateTime(2016-06-02 10:28:06.708 BST Qt::TimeSpec(LocalTime)) 
    //  dt.toString(Qt::ISODate); // "2016-06-02T10:28:06" -- DROPS timezone 
    QString localtime = dt.toString("yyyy-MM-ddTHH:mm:ss.zzz"); 
    int offsetFromUtcSec = dt.offsetFromUtc(); 
    // FOR TESTING: offsetFromUtcSec = -(3600 * 2.5); 
    QString tzinfo; 
    if (offsetFromUtcSec == 0) { 
     tzinfo = "Z"; 
    } else { 
     QString sign = offsetFromUtcSec < 0 ? "-" : "+"; 
     offsetFromUtcSec = abs(offsetFromUtcSec); 
     int hours = offsetFromUtcSec/3600; 
     int minutes = (offsetFromUtcSec % 3600)/60; 
     tzinfo += QString("%1%2:%3").arg(sign) 
      .arg(hours, 2, 10, QChar('0')) 
      .arg(minutes, 2, 10, QChar('0')); 
     // http://stackoverflow.com/questions/2618414/convert-an-int-to-a-qstring-with-zero-padding-leading-zeroes 
    } 
    return localtime + tzinfo; 
} 

QString datetimeToIsoMsUtc(const QDateTime& dt) 
{ 
    QDateTime utc_dt = dt.toTimeSpec(Qt::UTC); 
    return datetimeToIsoMs(utc_dt); 
} 

QDateTime isoToDateTime(const QString& iso) 
{ 
    return QDateTime::fromString(iso, Qt::ISODate); 
} 
2

Wenn ich brauche, dass ich die folgende Abhilfe verwenden:

QDateTime::currentDateTime().toOffsetFromUtc(QDateTime::currentDateTime().offsetFromUtc()).toString(Qt::ISODate);

Ich habe nicht geprüft, wenn @ lpappa arbeitet an neuen Versionen. Die obige Problemumgehung wurde auf Qt 5.3 getestet.