C ++ Konvertieren einer Zeitzeichenfolge in Sekunden aus der Epoche

8

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%     
Martin York 09.11.2010, 19:41
quelle

10 Antworten

6

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.

%Vor%     
Martin York 04.06.2016, 03:07
quelle
6

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).

    
Kirill V. Lyadvinsky 09.11.2010 19:52
quelle
4

Sie können eine Funktion wie strptime verwenden, um eine Zeichenfolge in ein struct tm zu konvertieren. , anstatt es manuell zu analysieren.

    
Justin Ethier 09.11.2010 19:46
quelle
3

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.

%Vor%     
Steve Townsend 09.11.2010 19:51
quelle
3
  

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.

%Vor%     
Mark Lakata 04.06.2016 00:58
quelle
2

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() .

    
Howard Hinnant 04.06.2016 02:08
quelle
1

Sie könnten die boost::date_time verwenden und einen kleinen manuellen Parser schreiben (wahrscheinlich regexp-basiert) für Ihre Strings.

    
Yippie-Ki-Yay 09.11.2010 19:44
quelle
1
  

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?

%Vor%     
casablanca 09.11.2010 19:57
quelle
1

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%     
Dirk Eddelbuettel 09.11.2010 19:58
quelle
0

X / Open stellt eine globale Variable timezone zur Verfügung, die angibt, um wie viele Sekunden die lokale Zeit hinter UTC liegt. Sie können damit die Ausgabe von mktime() :

anpassen %Vor%     
caf 12.11.2010 01:50
quelle

Tags und Links