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.