У меня есть 32-битная система Linux, в которой я должен записывать данные с отметкой времени со смещением секунды UINT32 от эпохи 1901-01-01 00:00:00.
Вычисление метки времени меня устраивает, поскольку я могу использовать 64-битный счетчик ticks()
и функции ticks_per_second()
для генерации секунд с начала эпохи следующим образом (мне требуется только разрешение второго уровня)
const ptime ptime_origin(time_from_string("1901-01-01 00:00:00"));
time_duration my_utc = microsec_clock::universal_time() - ptime_origin;
boost::int64_t tick_per_sec = my_utc.ticks_per_second();
boost::int64_t tick_count = my_utc.ticks();
boost::int64_t sec_since_epoch = tick_count/tick_per_sec;
Это работает для меня, так как я знаю, что в качестве целого числа без знака количество секунд не превысит максимальное значение UINT32 (ну, во всяком случае, не в течение многих лет).
Моя проблема заключается в том, что мое приложение может получать сообщение Modbus, содержащее значение UINT32, для которого я должен установить аппаратные и системные часы с помощью вызова ioctl
с использованием RTC_SET_TIME
. Этот UINT32 снова является смещением в секундах с моей эпохи 1901-01-01 00:00:00.
Теперь моя проблема заключается в том, что у меня нет возможности создать объект ptime
, используя 64-битные целые числа - часть ticks
объектов time_duration
является частной, и я ограничен использованием long
, который в моей 32-битной системе просто 4-байтовое целое число со знаком, недостаточно большое для хранения смещения секунд от моей эпохи.
У меня нет контроля над значением эпохи, и поэтому я действительно озадачен тем, как я могу создать требуемый объект boost::posix_time::ptime
из имеющихся у меня данных. Я, вероятно, могу получить грязное решение, вычислив количество секунд в определенные интервалы времени и используя дополнительную эпоху, чтобы создать мост, позволяющий это сделать, но мне было интересно, есть ли что-то в коде boost
, что позволит мне решить проблему полностью, используя библиотека boost datetime. Я прочитал всю документацию, которую смог найти, но не вижу очевидного способа сделать это.
РЕДАКТИРОВАТЬ: я нашел этот связанный вопрос Convert int64_t to time_duration, но принятый ответ там НЕ работает для моей эпохи