Разбор строки даты и времени в число для сравнения С++

Мое приложение получает строку даты и времени. Мне нужно иметь возможность проанализировать эту строку и сравнить ее с текущим временем в секундах.

Я анализирую это, как показано ниже, в struct tm t, чтобы получить год, месяц, день, час, минуту и ​​секунду отдельно.

    std::string timestr = "2020-12-18T16:40:07";
    struct tm t = {0};

    sscanf(timestr.c_str(), "%04d-%02d-%02dT%02d:%02d:%02d",
           &t.tm_year, &t.tm_mon,  &t.tm_mday,
           &t.tm_hour, &t.tm_min, &t.tm_sec);

Я не уверен, нужно ли мне преобразовывать это во время эпохи, но когда я это делаю, я получаю -1. Я не уверен, почему.

time_t t_of_day;
t_of_day = mktime(&t);

Мне действительно нужно сначала преобразовать это в эпоху?

Как мне лучше всего получить текущее время в секундах, а затем сравнить его с информацией о времени, которую я получаю t? Спасибо.

Представляет ли эта строка UTC или какой-то местный часовой пояс? Если часовой пояс, то какой?

Howard Hinnant 19.12.2020 15:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
1
301
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто используйте возможности библиотеки chrono:

auto tp    = std::chrono::system_clock::from_time_t(std::mktime(&t));
auto epoch = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch());

Но вам не нужно преобразовывать его в эпоху. Используйте сравнение std::chrono::time_point, например:

auto tp    = std::chrono::system_clock::from_time_t(std::mktime(&t));
auto now   = std::chrono::system_clock::now();

std::cout << (tp == now) << std::endl;
Ответ принят как подходящий

Вы хотите синтаксический анализ С++:

Https://en.cppreference.com/w/cpp/io/manip/get_time

std::stringstream timestr = "2020-12-18T16:40:07";
struct tm         t = {0};

timestr >> std::get_time(&t, "%Y-%m-%dT%H:%M:%S");

Я должен отметить, что в вашем коде есть ошибка: tm_year не совпадает с годом, который мы знаем. Это количество лет с 1900 года!

Https://www.cplusplus.com/reference/ctime/tm/

Итак, вашему коду нужна еще одна строка:

 t.tm_year -= 1900;

Примечание: std::get_time() уже делает эту компенсацию.

Вероятно, поэтому mktime() возвращает -1, так как 3920 год выходит за пределы допустимого диапазона.

Вы уверены, что t.tm_year -= 1900; требуется ? У меня показывает 2020 год, когда я распечатываю его даже без вычитания

Engineer999 21.12.2020 16:00

Другие вопросы по теме