2015-03-23 3 views
0

Я имею дело со временными метками, генерируемыми системой, где эпоха не является стандартной эпохой 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(&timestamp, &timeinfo); 

Это, кажется, работает как задумано (проводится до сочетания реальных и синтетических данных теста, до сих пор). Однако есть ли лучший способ справиться с этим сценарием? Есть ли какие-то тонкие способы, которыми это может сломаться? Дополнительная информация, если это имеет значение: временные метки распространяются в течение 1981 года до текущего дня, а программа запускается на машине Linux.

+0

'' не нужно; поскольку как 'int32_t', так и' time_t' являются арифметическими типами, преобразование выполняется неявно. –

+0

Спасибо за ввод, я обычно стараюсь делать это как записку для себя (и других), читая код, который кастинг преднамерен. –

+1

@BhargavBhat: он может подавлять предупреждения компилятора при преобразовании в тип, который не может хранить все исходные значения, будь то из-за использования меньшего количества байтов или подписания или без знака. В более общем случае, 32-битные значения, сохраняющие дату/время в эпоху UNIX, будут завершены в 2038 году - вы отрубили дополнительные ~ 5 лет - так должно быть до 2033 года. –

ответ

0

time_t уже является наследием C. В свое время вы действительно должны сделать класс. Основным преимуществом такого класса является то, что вы можете избежать непреднамеренного поведения. Вы определяете, какие операторы имеют смысл, а operator^, вероятно, нет. Вы определить, какие преобразования поддерживаются, и это, вероятно, просто time_t (если вообще - альтернатива является .getCtime() метод)

Внутренне, вы можете использовать unsigned long, который дает вам по крайней мере 68 лет дополнительно. Проблема Y2038 заключается в том, что time_t подписан, а период UNIX работает с 1902 по 2038 год.

Смежные вопросы