Как сравнить строку времени UTC (ISO 8601)

0

Вопрос

У меня возникли некоторые проблемы с сравнением временных строк в формате UTC.

Например:

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

Моя цель-выяснить, какое время самое позднее.

Я порылся в Интернете и нашел около mktime(); Но примеры строк в обычном формате, с другой стороны, моя строка в формате ISO8601.

Я ищу решение, совместимое с Windows и Linux.

Я бы действительно хотел получить некоторую помощь.

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

Лучший ответ

0

Чтобы наиболее легко учесть поле смещения 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 могут отличаться) вам придется проанализировать смещения и вычесть их из местного времени вручную.

2021-11-24 14:20:19

На других языках

Эта страница на других языках

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