Чтобы наиболее легко учесть поле смещения UTC, C++20 <chrono>
это правильный путь. Если у вас есть C++11/14/17, существует бесплатный предварительный просмотр этой части C++20 только для заголовков с открытым исходным кодом, который можно использовать. И он работает как в Linux, так и в Windows. Если вы используете C, это простое решение недоступно.
#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';
}
Выше приведено решение C++20.
Тип sys_seconds
это метка времени UTC с точностью до секунд. Когда это будет проанализировано с помощью parse
, проанализированное время считается местным временем и изменяется с помощью проанализированного смещения UTC перед назначением sys_seconds
аргумент. То E
модификатор в %Ez
инструктирует parse
чтобы найти :
в зачете. %z
(без E
) ищет смещение формы hhmm
.
Я установил failbit
в потоке, чтобы любые ошибки синтаксического анализа приводили к шумному исключению. Если вы предпочитаете проверить наличие in.fail()
вручную опустите настройку failbit
.
Однажды t1
и t2
разбираются на, их можно сравнивать так же, как арифметические типы.
Если вам нужно использовать бесплатный предварительный просмотр только для заголовков с открытым исходным кодом, просто добавьте #include "date/date.h"
и using namespace date;
к вышеупомянутой программе.
Если вы можете быть уверены, что смещения UTC всегда равны, то достаточно простого сравнения строк:
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 (и если смещения UTC могут отличаться) вам придется проанализировать смещения и вычесть их из местного времени вручную.