Jak porovnat mezi čas UTC řetězec (ISO 8601)

0

Otázka

Mám nějaké problémy, porovnat mezi časem řetězce, které jsou v UTC formátu.

Například:

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

Mým cílem je zjistit, který čas je poslední.

Jsem surfoval přes internet a zjistil, o mktime(); Ale příklad řetězce jsou v normálním formátu, na druhou stranu můj řetězec je ve formátu ISO8601.

Já jsem hledal řešení, které je kompatibilní s windows a linux.

Já bych opravdu ocení nějakou pomoc.

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

Nejlepší odpověď

0

K nejvíce snadno vzít v úvahu časový posun pole, C++20 <chrono> je způsob, jak jít. Pokud máte C++11/14/17, existuje zdarma, open-source, header-pouze náhled této části C++20, které mohou být použity. A to funguje na Linuxu a Windows. Pokud používáte C, toto jednoduché řešení není k dispozici.

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

Výše uvedené je C++20 řešení.

  • Typ sys_seconds je několik sekund-přesnost časové razítko UTC. Když tento je analyzován do s parse, analyzovat čas je považován za místního času, a modifikován analyzován posun vůči UTC předtím, než je přidělen k sys_seconds argument. Na E modifikátor %Ez pověřuje parse hledat : v offset. %z (bez E) vypadá pro ofsetový formuláře hhmm.

  • Jsem nastavit failbit v proudu tak, že každý analyzovat chyby, výsledek v hlučném výjimkou. Pokud byste raději zkontrolovat in.fail() ruční, vynechat nastavení failbit.

  • Jednou t1 a t2 jsou analyzovány do, mohou být v porovnání jen jako aritmetické typy.

  • Pokud potřebujete používat zdarma, open-source, header-pouze náhled, stačí přidat #include "date/date.h" a using namespace date; do výše uvedeného programu.

Pokud můžete být jisti, že UTC kompenzace jsou vždy stejné, pak jednoduchý řetězec srovnání je dostačující:

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 pokud UTC offsety mohou být různé), budete muset analyzovat posuny a odečíst je z místní časy ručně.

2021-11-24 14:20:19

V jiných jazycích

Tato stránka je v jiných jazycích

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