Tworzenie obiektu boost :: posix_time :: ptime z 64-bitowej liczby całkowitej

Mam 32-bitowy system Linux, w którym muszę rejestrować dane oznaczone datą UINT32 drugiego przesunięcia od epoki 1901-01-01 00:00:00.

Obliczenie znacznik czasu jest dla mnie w porządku, ponieważ mogę użyć 64-bitowegoticks() licznik iticks_per_second() funkcje generowania sekund od epoki w następujący sposób (wymagam tylko rozdzielczości drugiego poziomu)

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;

To działa dla mnie, ponieważ wiem, że jako liczba całkowita bez znaku, liczba sekund nie przekroczy maksymalnej wartości UINT32 (a przynajmniej nie przez wiele lat).

Mam problem z tym, że moja aplikacja może otrzymać wiadomość Modbus zawierającą wartość UINT32, dla której muszę ustawić zegar sprzętowy i systemowy za pomocąioctl zadzwoń za pomocąRTC_SET_TIME. Ten UINT32 jest ponownie przesunięciem w sekundach od mojej epoki 1901-01-01 00:00:00.

Moim problemem jest teraz to, że nie mam możliwościStwórz a ptime obiekt przy użyciu 64-bitowych liczb całkowitych -ticks częśćtime_duration obiekty są prywatne i jestem ograniczony do używanialong który w moim 32-bitowym systemie jest po prostu 4-bajtową liczbą całkowitą, która nie jest wystarczająco duża, aby zapisać sekundy przesunięcia z mojej epoki.

Nie mam kontroli nad wartością epoki, więc jestem naprawdę zakłopotany co do tego, jak mogę stworzyć moje wymaganeboost::posix_time::ptime sprzeciwić się danym, które mam. Prawdopodobnie mogę uzyskać brudne rozwiązanie, obliczając twarde drugie zliczenia do określonych przedziałów czasowych i używając dodatkowej epoki, aby stworzyć most, aby to umożliwić, ale zastanawiałem się, czy jest coś wboost kod, który pozwoli mi rozwiązać problem całkowicie za pomocą biblioteki datetime doładowania. Przeczytałem całą dokumentację, którą mogę znaleźć, ale nie widzę żadnego oczywistego sposobu, aby to zrobić.

EDIT: Znalazłem to powiązane pytanieKonwertuj int64_t na time_duration ale zaakceptowana odpowiedź NIE działa dla mojej epoki

questionAnswers(2)

yourAnswerToTheQuestion