Para mais facilmente se levar em conta o deslocamento do UTC em campo, C++20 <chrono>
é o caminho a percorrer. Se você tiver C++11/14/17, existe um livre, open-source, apenas do cabeçalho de pré-visualização de esta parte do C++20 que pode ser usado. E ele funciona tanto no Linux quanto no Windows. Se você estiver usando C, esta solução fácil não está disponível.
#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';
}
Acima é o C++20 solução.
O tipo de sys_seconds
é uma segundos precisão hora UTC. Quando este é analisado para com parse
, analisada tempo, é considerado como a hora local, e modificado pela analisado o deslocamento UTC antes de ser atribuído à sys_seconds
argumento. O E
modificador na %Ez
instrui parse
ao olhar para o :
no deslocamento. %z
(sem o E
) procura por um deslocamento do formulário hhmm
.
Eu tenho o failbit
na sequência, de modo a que quaisquer erros de análise resultar em um ruidoso exceção. Se você gostaria de verificação para in.fail()
manualmente, omitir definição failbit
.
Uma vez t1
e t2
são analisados em, podem ser comparadas apenas como tipos de aritmética.
Se você precisa usar o livre, open-source, apenas do cabeçalho de pré-visualização, basta adicionar #include "date/date.h"
e using namespace date;
para o programa acima.
Se você pode ter a certeza de que o utcs são sempre iguais, em seguida, uma simples comparação de seqüência de caracteres é suficiente:
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';
Em C (e, se for o UTC deslocamentos podem ser diferentes), você vai ter que analisar os deslocamentos e subtraí-los a locais vezes manualmente.