Мое приложение получает строку даты и времени. Мне нужно иметь возможность проанализировать эту строку и сравнить ее с текущим временем в секундах.
Я анализирую это, как показано ниже, в 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? Спасибо.
Просто используйте возможности библиотеки 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 год, когда я распечатываю его даже без вычитания
Представляет ли эта строка UTC или какой-то местный часовой пояс? Если часовой пояс, то какой?