Come confrontare tra ora UTC string (ISO 8601)

0

Domanda

Sto avendo alcuni problemi di confrontare tra stringhe in formato UTC.

Per esempio:

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

Il mio obiettivo è quello di scoprire che il tempo è più recente.

Ho navigato attraverso internet e ho trovato su mktime(); Ma l'esempio stringhe sono in formato normale, d'altra parte la mia stringa è in formato ISO8601.

Sto cercando una soluzione che sia compatibile con windows e linux.

Vorrei davvero apprezzata po ' di aiuto.

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

Migliore risposta

0

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 parsel'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.

2021-11-24 14:20:19

In altre lingue

Questa pagina è in altre lingue

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