Helpers - компьютеры, интернет, программирование

Преобразование строки времени в секунды в задачах C ++

Я пишу приложение C ++ на встроенном устройстве ARM под управлением Embedded Linux.

Я пытаюсь преобразовать строку даты и времени в секунды, вычесть ее из текущего времени в секундах и принять меры, если количество прошедших секунд больше определенного числа.

То, что должно быть довольно простым в реализации, оказалось довольно сложным, и я не уверен, почему.

Разница во времени, которую я вычисляю, оказывается огромной величиной, хотя на самом деле она должна быть небольшой. См. Мой код ниже. Я вручную жестко кодирую строку времени и даты для тестирования.

std::string       timestr = "2020-12-21T16:07:00";
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);

t.tm_year -= 1900;   // This is required because my year should be the number of years since 1900

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

auto now_s = std::chrono::time_point_cast<std::chrono::seconds>(now);
auto tp_s = std::chrono::time_point_cast<std::chrono::seconds>(tp);

std::chrono::duration<double> diff = now-tp;  // Huge number

auto elapsed = now_s - tp_s;   // This value is massive and not as expected when printed out

  • Как вы думаете, в какой единице будет выражаться now - tp? Почему? Вам нужно std::duration_cast() это в нужный блок, а вы этого не сделали. 21.12.2020
  • Отвечает ли это на ваш вопрос? Как рассчитать разницу во времени в C ++ 21.12.2020
  • @underscore_d Я изменил свой вопрос. Я использую std :: chrono :: time_point_cast и все еще получаю неверное значение. 21.12.2020
  • Он все еще огромен или это неправильно? Каковы значения tp, now, а также огромный и / или неправильный результат в обоих случаях? Это не очень понятно. 21.12.2020
  • @NathanPierson Я получаю разницу во времени между настоящим моментом и временем, которое было несколько минут назад. Я бы ожидал 120 секунд, если это, например, 2 минуты 21.12.2020
  • @underscore_d: Я получаю разницу во времени: сейчас - tp: 51243598. ... и разница во времени now_s - tp_s: 4292288967. Не понимаю, почему 21.12.2020
  • @underscore_d Я решил это. Вы знаете, в чем была ошибка / проблема ?? Также необходимо вычесть 1 из месяца. Следовательно, январь начинается с 0, а не с 1. 21.12.2020
  • Как вы относитесь к летнему времени? 21.12.2020
  • @JohnFilleau Что ты имеешь в виду? 21.12.2020
  • Вы всегда имеете дело со временем без часовых поясов по Гринвичу / UTC и т. Д.? Или вы могли бы иметь дело с временами в рамках политических границ, когда используется летнее время? Разница между 1:30 и 3:30 в один и тот же день обычно составляет два часа, но иногда один час, а иногда и три, в зависимости от того, где вы живете. 21.12.2020
  • @ Engineer999 Хорошо обнаружено! Кажется, стоит опубликовать ответ, чтобы закрыть это. 22.12.2020

Ответы:


1

Для тех, кому интересно, решил эту проблему.

Мы не только должны вычесть 1900 из количества лет до вызова std::mktime(&t).

t.tm_year -= 1900;

но также нужно вычесть 1 из количества месяцев t.tm_mon -= 1.

Месяцы пронумерованы от 0 до 11, а не от 1 до 12, как мы ожидали.

Это объясняет, почему была большая разница в секундах.

22.12.2020
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..