Comment comparer entre l'heure UTC chaîne de caractères (ISO 8601)

0

La question

Je vais avoir quelques problèmes pour comparer entre les chaines de temps qui sont au format UTC.

Par exemple:

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

Mon objectif est de trouver où le temps s'est plus tard.

J'ai surfé via internet et a trouvé à propos de mktime(); Mais exemple les chaînes de caractères sont au format normal, sur l'autre main dans mon string est en format ISO8601.

Je suis à la recherche d'une solution qui est compatible avec windows et linux.

Je remercie vraiment de l'aide.

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

La meilleure réponse

0

De plus facilement prendre en compte le décalage UTC champ, C++20 <chrono> est le chemin à parcourir. Si vous avez le C++11/14/17, il existe un logiciel gratuit, open-source, en-tête uniquement aperçu de cette partie du C++20 qui peut être utilisé. Et il fonctionne sur Linux et Windows. Si vous êtes à l'aide de C, cette solution simple n'est pas 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';
}

Ci-dessus est le C++20 solution.

  • Le type sys_seconds est secondes-précision horodatage UTC. Lorsque ceci est analysé avec parse, l'analyse du temps est considéré comme temps local, et modifié par l'analyse décalage UTC avant d'être affecté à l' sys_seconds argument. L' E modificateur dans %Ez charge parse de chercher pour le : le décalage. %z (sans le E) recherche pour un décalage de la forme hhmm.

  • J'ai réglé le failbit dans le cours d'eau de sorte que les éventuelles erreurs d'analyse le résultat dans un bruyant exception. Si vous préférez vérifier in.fail() manuellement, omettre le paramètre failbit.

  • Une fois t1 et t2 sont analysées dans, ils peuvent être comparés juste comme l'arithmétique types.

  • Si vous devez utiliser le logiciel gratuit, open-source, en-tête uniquement aperçu, il suffit d'ajouter #include "date/date.h" et using namespace date; le programme ci-dessus.

Si vous pouvez être assuré que les décalages horaires sont toujours égaux, alors qu'une simple comparaison de chaîne est suffisante:

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 (et si les décalages horaires peuvent être différents), vous aurez à analyser les décalages et les soustraire de l'heure locale manuellement.

2021-11-24 14:20:19

Dans d'autres langues

Cette page est dans d'autres langues

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