Jak porównać ciąg znaków czasu UTC (ISO 8601)

0

Pytanie

Mam pewne problemy z porównaniem tymczasowych wierszy w formacie UTC.

Na przykład:

string1 = "1997-07-16T19:20:30+01:00"
string2 = "2000-07-17T20:20:30+01:00"

Mój cel-dowiedzieć się, jaki czas najpóźniej.

Będę grzebał w Internecie i znalazłem około mktime(); Ale przykłady wierszy w normalnym formacie, z drugiej strony, moja ciąg w formacie ISO8601.

Szukam rozwiązania, zgodne z Windows i Linux.

Naprawdę chciałbym uzyskać jakąś pomoc.

c++ datetime
2021-11-24 02:57:06
1

Najlepsza odpowiedź

0

Aby najłatwiej wziąć pod uwagę polu przesunięcie UTC, C++20 <chrono> to we właściwy sposób. Jeśli masz C++11/14/17, istnieje bezpłatny podgląd tej części C++20 tylko dla tytułów z open source, które można wykorzystać. I to działa jak w systemie Linux, jak i Windows. Jeśli używasz C, to proste rozwiązanie nie jest dostępne.

#include <chrono>
#include <iostream>
#include <sstream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    string string1 = "1997-07-16T19:20:30+01:00";
    string string2 = "2000-07-17T20:20:30+01:00";
    sys_seconds t1, t2;

    string format = "%FT%T%Ez";

    istringstream in{string1};
    in.exceptions(ios::failbit);
    in >> parse(format, t1);
    in.clear();
    in.str(string2);
    in >> parse(format, t2);

    if (t1 > t2)
        cout << string1 << " is later than " << string2 << '\n';
    else if (t2 > t1)
        cout << string2 << " is later than " << string1 << '\n';
    else
        cout << string1 << " is the same time as " << string2 << '\n';
}

Powyżej opisane rozwiązanie C++20.

  • Typ sys_seconds jest to znacznik czasu UTC z dokładnością do sekund. Kiedy to będzie analizowane za pomocą parse, analizująca czas jest czasem lokalnym i zmienia się za pomocą zanalizowanej przesunięcie UTC przed powołaniem sys_seconds argument. To E modyfikator w %Ez instruuje parse aby znaleźć : w klasyfikacji generalnej. %z (bez E) poszukuje przesunięcie formy hhmm.

  • Zainstalowałem failbit w strumieniu, aby wszelkie błędy analizy doprowadziły do шумному wykluczenia. Jeśli wolisz, aby sprawdzić dostępność in.fail() ręcznie obniż ustawienie failbit.

  • Pewnego dnia t1 i t2 jest rozbierana na czynniki pierwsze, można je porównać, tak samo jak typy arytmetyczne.

  • Jeśli trzeba użyć bezpłatny podgląd tylko dla tytułów z open source, wystarczy dodać #include "date/date.h" i using namespace date; do wspomnianego wyżej programu.

Jeśli możesz być pewien, że przesunięcie UTC zawsze są równe, dość prostego porównania wierszy:

if (string1 > string2)
    cout << string1 << " is later than " << string2 << '\n';
else if (string2 > string1)
    cout << string2 << " is later than " << string1 << '\n';
else
    cout << string1 << " is the same time as " << string2 << '\n';

W C (i jeśli przesunięcie UTC mogą się różnić). trzeba przeanalizować przesunięcia i odjąć je z lokalnego czasu ręcznie.

2021-11-24 14:20:19

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................