Erstellen eines boost :: posix_time :: ptime-Objekts aus einer 64-Bit-Ganzzahlsekunde

Ich habe ein 32-Bit-Linux-System, in dem ich Daten aufzeichnen muss, die mit einem UINT32-Sekunden-Versatz von einer Epoche von 1901-01-01 00:00:00 zeitgestempelt sind.

Rechnen Der Zeitstempel ist für mich in Ordnung, da ich die 64-Bit-Version verwenden kannticks() Zähler undticks_per_second() Funktionen zum Generieren der Sekunden seit der Epoche wie folgt (ich benötige nur eine Auflösung der zweiten Ebene)

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;

Dies funktioniert für mich, da ich weiß, dass als vorzeichenlose Ganzzahl die Anzahl der Sekunden den maximalen UINT32-Wert nicht überschreitet (auch nicht für viele Jahre).

Das Problem, das ich habe, ist, dass meine Anwendung eine Modbus-Nachricht empfangen kann, die einen UINT32-Wert enthält, für den ich die Hardware- und Systemuhr mit einem einstellen mussioctl anrufen mitRTC_SET_TIME. Diese UINT32 ist wieder der Offset in Sekunden seit meiner Epoche 1901-01-01 00:00:00.

Mein Problem ist jetzt, dass ich keine Möglichkeit dazu habeerstellen a ptime Objekt mit 64-Bit-Ganzzahlen - dieticks Teil dertime_duration objects ist privat und ich kann es nur benutzenlong Was auf meinem 32-Bit-System nur eine 4-Byte-Ganzzahl mit Vorzeichen ist, die nicht groß genug ist, um den Sekundenversatz von meiner Epoche zu speichern.

Ich habe keine Kontrolle über den Wert der Epoche und bin wirklich ratlos, wie ich meinen Bedarf schaffen kannboost::posix_time::ptime Objekt aus den Daten, die ich habe. Ich kann wahrscheinlich eine schmutzige Lösung erhalten, indem ich harte Sekunden für bestimmte Zeitintervalle berechne und eine zusätzliche Epoche verwende, um eine Brücke zu bauen, um dies zu ermöglichen, aber ich habe mich gefragt, ob etwas in der istboost Code, mit dem ich das Problem mithilfe der boost datetime-Bibliothek vollständig lösen kann. Ich habe die gesamte Dokumentation gelesen, die ich finden kann, sehe jedoch keinen offensichtlichen Weg, dies zu tun.

EDIT: Ich habe diese verwandte Frage gefundenKonvertieren Sie int64_t in time_duration Aber die dort akzeptierte Antwort funktioniert NICHT für meine Epoche

Antworten auf die Frage(2)

Ihre Antwort auf die Frage