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.