Поскольку 1530173696
используется в качестве Unix Time (UTC без учета високосных секунд), это можно решить без использования часовых поясов.
Библиотека даты / времени Говарда Хиннанта может быть использована для решения этой проблемы и проверки правильности полученного ответа. Однако перейдите к концу этого ответа, если вы хотите увидеть, как это сделать очень просто, без использования какой-либо библиотеки.
1530173696
- количество секунд с 1970-01-01 UTC. Если вы хотите преобразовать это в удобочитаемую дату / время, можно:
#include "date/date.h"
#include <iostream>
int
main()
{
time_t datetime = 1530173696;
date::sys_seconds tp{std::chrono::seconds{datetime}};
using date::operator<<;
std::cout << tp << '\n';
}
который выводит:
2018-06-28 08:14:56
Это не делает ничего, кроме проверки ввода. Более того, tp
- это не что иное, как std::chrono::time_point
, основанное на system_clock
, но с точностью до seconds
. Вы можете округлить это до часа с помощью:
tp = floor<std::chrono::hours>(tp);
Здесь floor
можно получить из "date.h"
в namespace date
или, если у вас C ++ 17 или более поздняя версия, вы можете использовать std::chrono::floor
. Вы можете использовать "date.h"
, чтобы снова напечатать tp
, и вы получите:
2018-06-28 08:00:00
(по желанию). Чтобы превратить это обратно в time_t
, просто извлеките duration
, а затем count
:
time_t myTime_T = tp.time_since_epoch().count();
Это будет иметь значение 1530172800
, как и ожидалось.
Наконец, если вам не нужно распечатывать эти метки времени в удобочитаемой для человека форме, вы можете довольно легко самостоятельно выполнить математику:
time_t myTime_T = datetime / 3600 * 3600;
По сути, это та же операция, что и:
tp = floor<std::chrono::hours>(tp);
за исключением того, что версия floor
продолжит получать правильный ответ, когда ввод будет отрицательным (отметка времени до 1970-01-01 00:00:00 UTC). «Ручная» реализация округляет вверх до следующего часа, если дан отрицательный вход.