Ich habe eine Zeichenfolge mit dem folgenden Format:
2010-11-04T23: 23: 01Z
Das Z gibt an, dass die Zeit UTC ist.
Ich würde dies lieber als eine Epoche speichern, um Vergleiche zu erleichtern.
Was ist die empfohlene Methode dafür?
Gegenwärtig (nach einer Quck-Suche) ist der simple Algorithmus:
%Vor%Mit der C ++ 11-Funktionalität können wir jetzt Streams zum Parsen verwenden:
Der iomanip std::get_time
konvertiert eine Zeichenfolge basierend auf einer Reihe von Formatparametern und konvertiert sie in ein struct tz
-Objekt.
Sie können dann std::mktime()
verwenden, um dies in einen Epoch-Wert umzuwandeln.
Dies ist das ISO8601-Format. Sie können strptime
function verwenden, um es mit %FT%T%z
argument zu parsen. Es ist kein Teil des C ++ Standards, obwohl Sie eine Open-Source-Implementierung davon verwenden können ( dies , zum Beispiel).
Sie können eine Funktion wie strptime verwenden, um eine Zeichenfolge in ein struct tm
zu konvertieren. , anstatt es manuell zu analysieren.
Es ist keine exakte Kopie, aber Sie finden die Antwort von @ Cubbi von hier nützlich, wette ich. Dies setzt speziell die UTC-Eingabe voraus.
Boost unterstützt auch die direkte Konvertierung von ISO 8601 über boost::posix_time::from_iso_string
, die boost::date_time::parse_iso_time
aufruft. Auch hier würden Sie einfach das nachgestellte 'Z' entfernen und das TZ als implizite UTC behandeln.
Problem hier ist, dass mktime lokale Zeit nicht UTC Zeit verwendet.
Linux liefert timegm
, was Sie wollen (d. h. mktime für die UTC-Zeit).
Hier ist meine Lösung, die ich nur "Zulu" (Z Zeitzone) akzeptieren musste. Hinweis
Das strptime
scheint die Zeitzone nicht korrekt zu analysieren
obwohl glib scheint etwas Unterstützung dafür zu haben. Deshalb werfe ich einfach ein
Ausnahme, wenn die Zeichenfolge nicht in 'Z' endet.
Neue Antwort auf eine alte Frage. Grund für eine neue Antwort: Falls Sie <chrono>
types verwenden wollen, um ein Problem wie dieses zu lösen.
Zusätzlich zu C ++ 11 / C ++ 14 benötigen Sie dieses freie Open-Source-Datum / Uhrzeit Bibliothek :
%Vor%Dieses Programm gibt aus:
%Vor% Wenn die Analyse fehlschlägt, wird eine Ausnahme ausgelöst. Wenn Sie keine Ausnahmen ausliefern möchten, verwenden Sie nicht is.exceptions(std::ios::failbit);
, sondern prüfen Sie stattdessen auf is.fail()
.
Sie könnten die boost::date_time
verwenden und einen kleinen manuellen Parser schreiben (wahrscheinlich regexp-basiert) für Ihre Strings.
Problem hier ist, dass mktime lokale Zeit nicht UTC Zeit verwendet.
Wie wäre es, wenn Sie nur den Zeitunterschied zwischen UTC und lokaler Zeit berechnen und ihn dann zu dem von mktime
zurückgegebenen Wert hinzufügen?
Was ist los mit strptime()
?
Und unter Linux erhalten Sie sogar das Feld "Sekunden östlich von UTC", sodass Sie nicht mehr parsen müssen:
%Vor%was für mich ergibt
%Vor%Tags und Links c c++ time platform-independent