Cum pentru a compara între timp UTC string (ISO 8601)

0

Problema

Sunt unele probleme pentru a compara între timp, siruri de caractere care sunt în format UTC.

De exemplu:

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

Scopul meu este de a afla care dată este mai recentă.

Am navigat prin internet și a aflat despre mktime(); Dar, de exemplu, siruri de caractere sunt în mod normal format, pe de altă parte, șirul meu este în ISO8601 format.

Eu sunt în căutarea pentru o soluție care este compatibil cu windows și linux.

Mi-ar într-adevăr apreciem ajutor.

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

Cel mai bun răspuns

0

Pentru cele mai ușor să ia în considerare decalajul UTC domeniu, C++20 <chrono> este calea de a merge. Dacă aveți C++11/14/17, există un program gratuit, open-source, antet-doar preview din această parte de C++20, care pot fi utilizate. Și acesta funcționează atât pe Windows și Linux. Dacă utilizați C, această soluție simplă nu este disponibil.

#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';
}

De mai sus este C++20 de soluție.

  • Tipul sys_seconds este o secunde precizie UTC timestamp. Atunci când acest lucru este analizat în cu parse, a analizat timp este considerat ca ora locală, și a fost modificat de analizat UTC offset înainte de a fi atribuit sys_seconds argument. La E modificator în %Ez instruiește parse să se uite pentru : în offset. %z (fără E) se pare pentru un offset de forma hhmm.

  • Am setat failbit în flux, astfel încât orice analiza erorile rezultat un spectacol de excepție. Dacă ar mai degrabă pentru a verifica in.fail() manual, omite stabilirea failbit.

  • O dată t1 și t2 sunt analizate în, ele pot fi comparate doar ca tipuri de aritmetică.

  • Dacă aveți nevoie pentru a utiliza gratuit, open-source, antet-doar preview, trebuie doar să adăugați #include "date/date.h" și using namespace date; pentru programul de mai sus.

Dacă puteți fi siguri că UTC compensările sunt întotdeauna egale, atunci un simplu șir de comparație este suficientă:

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';

În C (iar dacă UTC offset pot fi diferite), va trebui să elimine decalajele și le scade din local ori manual.

2021-11-24 14:20:19

În alte limbi

Această pagină este în alte limbi

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