Ako porovnávať medzi časom UTC čas string (ISO 8601)

0

Otázka

Mám nejaké otázky, porovnávať čas reťazce, ktoré sú v UTC formát.

Napríklad:

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

Mojím cieľom je zistiť, ktorý čas je posledná.

Mám aj cez internet a našiel asi mktime(); Ale napríklad reťazce sú v bežnom formáte, na druhej strane môj reťazec je v ISO8601 formát.

Hľadám riešenie, ktoré je kompatibilné s windows a linux.

Ja by som naozaj appriciate nejakú pomoc.

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

Najlepšiu odpoveď

0

Väčšina ľahko vziať do úvahy UTC offset oblasti, C++20 <chrono> je spôsob, ako ísť. Ak máte C++11/14/17, existuje zadarmo, open-source, hlavička iba náhľad tejto časti C++20, ktoré môžu byť použité. A to funguje na oboch Linux a Windows. Ak používate C, toto jednoduché riešenie nie je k dispozícii.

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

Vyššie uvedené je C++20 riešenie.

  • Druh sys_seconds je sekúnd-presné UTC čas. Keď to je rozložený do s parsesa analyzovaný čas je považovaný za miestneho času, a modifikované analyzovaný UTC offset pred pridelením na sys_seconds argument. Na E modifikátor v %Ez poveruje parse hľadať : v kompenzovať. %z (bez E) vyzerá na offset formulár hhmm.

  • Som nastaviť failbit v potoku tak, aby každá analyzovať chyby výsledok v hlučnom výnimkou. Ak by ste radšej skontrolovať in.fail() manuálne, vynechajte nastavenie failbit.

  • Raz t1 a t2 sú rozložený do, môžu byť v porovnaní rovnako ako aritmetický typy.

  • Ak potrebujete použiť zadarmo, open-source, hlavička iba náhľad, stačí pridať #include "date/date.h" a using namespace date; vyššie program.

Ak môžete byť istí, že UTC posuny sú vždy rovnaké, potom jednoduchý reťazec porovnanie je dostatočné:

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

V C (a ak UTC kompenzácie môžu byť rôzne), budete musieť analyzovať ofsety a odčítanie ich od miestneho krát manuálne.

2021-11-24 14:20:19

V iných jazykoch

Táto stránka je v iných jazykoch

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