Per la maggior parte facilmente prendere in considerazione l'UTC del campo, C++20 <chrono>
è il modo per andare. Se si dispone di C++11/14/17, esiste un libero, open-source, intestazione-solo un'anteprima di questa parte del C++20 che possono essere utilizzati. E funziona sia su Linux che su Windows. Se si utilizza C, questa soluzione facile non è disponibile.
#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';
}
Qui sopra è il C++20 soluzione.
Il tipo sys_seconds
è un secondi di precisione data e l'ora UTC. Quando questo viene analizzato in con parse
l'analizzato il tempo è considerato come ora locale, e modificato dal analizzato UTC offset, prima di essere assegnato al sys_seconds
argomento. Il E
modificatore %Ez
indica parse
per cercare l' :
l'offset. %z
(senza E
) cerca un offset di forma hhmm
.
Ho impostato la failbit
il flusso in modo che eventuali errori di analisi di risultato in un rumoroso eccezione. Se invece vuoi controllare in.fail()
manualmente, è possibile omettere l'impostazione failbit
.
Una volta t1
e t2
sono analizzati in, che può essere paragonato proprio come i tipi aritmetici.
Se avete bisogno di usare il libero, open-source, intestazione-solo un'anteprima, basta aggiungere #include "date/date.h"
e using namespace date;
per il programma di cui sopra.
Se si può essere certi che l'UTC offset sono sempre uguali, quindi una semplice stringa di confronto è sufficiente:
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';
In C (e se l'offset UTC può essere diverso), si dovrà analizzare l'offset e sottrarre loro locali a volte manualmente.