UTC zaman dizesi (ISO 8601)arasında karşılaştırma nasıl yapılır

0

Soru

UTC biçiminde olan zaman dizeleri arasında karşılaştırma yapmak için bazı sorunlar yaşıyorum.

Örneğin:

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

Amacım en son hangi saatte olduğunu bulmak.

İnternette sörf yaptım ve buldum mktime(); Ancak örnek dizeler normal biçimdedir, diğer yandan dizem ISO8601 biçimindedir.

Windows ve linux ile uyumlu bir çözüm arıyorum.

Gerçekten biraz yardım isteyeceğim.

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

En iyi cevabı

0

UTC ofset alanını en kolay şekilde hesaba katmak için C++20 <chrono> gitmenin yolu bu. C++11/14/17'niz varsa, kullanılabilecek C++20'nin bu bölümünün ücretsiz, açık kaynaklı, yalnızca üstbilgi önizlemesi vardır. Ve hem Linux hem de Windows üzerinde çalışır. C kullanıyorsanız, bu kolay çözüm kullanılamaz.

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

Yukarıda C++20 çözümüdür.

  • Tür sys_seconds saniye duyarlıklı UTC zaman damgasıdır. Bu ayrıştırıldığında parse, ayrıştırılan saat yerel saat olarak kabul edilir ve atanmadan önce ayrıştırılan UTC mahsupuyla değiştirilir. sys_seconds tartışma. Bu E değiştirici %Ez bilgilendiriyor parse aranacak : ofsette. %z (olmadan E) formun ofsetini arar hhmm.

  • Ben kurdum failbit akışta, herhangi bir ayrıştırma hatası gürültülü bir özel duruma neden olur. Kontrol etmeyi tercih ederseniz in.fail() ayarı manuel olarak atlayın failbit.

  • Bir zamanlar t1 ve t2 ayrıştırılır, aritmetik türler gibi karşılaştırılabilirler.

  • Eğer kullanmak gerekli olan ücretsiz, açık kaynak, başlık-sadece önizleme, sadece ekleyin #include "date/date.h" ve using namespace date; yukarıdaki programa.

UTC uzaklıklarının her zaman eşit olduğundan emin olabilirseniz, basit bir dize karşılaştırması yeterlidir:

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

C'de (ve UTC uzaklıkları farklı olabilirse), uzaklıkları ayrıştırmanız ve bunları yerel saatlerden el ile çıkarmanız gerekir.

2021-11-24 14:20:19

Diğer dillerde

Bu sayfa diğer dillerde

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