Я имею дело со временными метками, генерируемыми системой, где эпоха не является стандартной эпохой UNIX секунд с полуночи 1 января 1970 года (она начинается где-то в 1965 году). This вопрос есть родственный. Итак, у меня есть функция «FixUp», чтобы справиться с этим смещение:Смещение time_t в C++
time_t fix_time(uint32_t raw_time)
{
const int32_t epoch_offset = 157680000; /* offset wrt UNIX epoch */
time_t fixedTime = static_cast<time_t>(raw_time - epoch_offset);
return fixedTime;
}
и продолжать использовать стандартные функции библиотеки в остальной части кода:
uint32_t raw_time;
time_t timestamp = fix_timestamp(raw_time);
struct tm timeinfo;
gmtime_r(×tamp, &timeinfo);
Это, кажется, работает как задумано (проводится до сочетания реальных и синтетических данных теста, до сих пор). Однако есть ли лучший способ справиться с этим сценарием? Есть ли какие-то тонкие способы, которыми это может сломаться? Дополнительная информация, если это имеет значение: временные метки распространяются в течение 1981 года до текущего дня, а программа запускается на машине Linux.
'' не нужно; поскольку как 'int32_t', так и' time_t' являются арифметическими типами, преобразование выполняется неявно. –
Спасибо за ввод, я обычно стараюсь делать это как записку для себя (и других), читая код, который кастинг преднамерен. –
@BhargavBhat: он может подавлять предупреждения компилятора при преобразовании в тип, который не может хранить все исходные значения, будь то из-за использования меньшего количества байтов или подписания или без знака. В более общем случае, 32-битные значения, сохраняющие дату/время в эпоху UNIX, будут завершены в 2038 году - вы отрубили дополнительные ~ 5 лет - так должно быть до 2033 года. –