Para más fácilmente tomar en cuenta el desplazamiento de UTC de campo, C++20 <chrono>
es el camino a seguir. Si usted tiene C++11/14/17, existe una libre, de código abierto, en el encabezado de sólo vista previa de esta parte de C++20 que puede ser utilizado. Y funciona en Linux y Windows. Si estás usando C, esta fácil solución no está disponible.
#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';
}
Arriba es el C++20 solución.
El tipo de sys_seconds
es un segundos de precisión marca de hora UTC. Cuando esto se analiza con parse
el analiza el tiempo es considerado como la hora local, y modificado por la analiza desplazamiento de UTC antes de ser asignado a la sys_seconds
argumento. El E
modificador en %Ez
indica parse
para buscar la :
en el desplazamiento. %z
(sin el E
) busca un desplazamiento de la forma hhmm
.
He puesto los failbit
en la secuencia, de modo que cualquier analizar los errores resultan en un ruidoso excepción. Si prefiere comprobar in.fail()
manualmente, omitir la configuración failbit
.
Una vez t1
y t2
se analiza en, que puede ser comparado como la aritmética de los tipos.
Si necesita utilizar el código abierto, libre de cabecera, sólo de vista previa, sólo tiene que añadir #include "date/date.h"
y using namespace date;
para el programa anterior.
Si usted puede estar seguro de que la UTC, los desplazamientos son siempre iguales, entonces una simple comparación de cadenas es 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';
En C (y si la UTC, las compensaciones pueden ser diferentes), usted tendrá que analizar los desplazamientos y restar ellas a partir de los tiempos de forma manual.