Cómo comparar entre la hora UTC de la cadena (ISO 8601)

0

Pregunta

Estoy teniendo algunos problemas para comparar entre el tiempo de las cadenas que están en formato UTC.

Por ejemplo:

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

Mi objetivo es encontrar que el tiempo es más reciente.

He navegado por internet y encontré acerca de mktime(); Pero ejemplo son las cadenas de caracteres en formato normal, por otro lado mi cadena es en formato ISO8601.

Estoy en busca de una solución que es compatible con windows y linux.

Yo realmente disfrutar un poco de ayuda.

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

Mejor respuesta

0

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 parseel 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.

2021-11-24 14:20:19

En otros idiomas

Esta página está en otros idiomas

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