Ich habe ein 32-Bit Linux System, in dem ich Daten aufzeichnen muss, die mit einem UINT32 zweiten Offset aus einer Epoche von 1901-01- 01 00:00:00.Erstellen eines boost :: posix_time :: ptime Objekts aus einer 64 Bit Ganzzahl zweiter Zähler
Berechnung der Zeitstempel ist für mich ok, als ich die 64-Bit-ticks()
Zähler und ticks_per_second()
Funktionen verwenden kann, um die Sekunden zu erzeugen, da Epoche wie folgt (I nur zweite Ebene Auflösung erfordern)
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 eine vorzeichenlose Integer, die Sekunden zählen nicht die maximale UINT32 Wert (naja, nicht für viele Jahre sowieso).
Das Problem, das ich habe, ist, dass meine Anwendung eine Modbus-Nachricht erhalten kann, die einen UINT32-Wert enthält, für den ich die Hardware- und Systemuhr mit einem ioctl
Anruf unter Verwendung RTC_SET_TIME
einstellen muss. Dieser UINT32 ist wieder der Offset in Sekunden seit meiner Epoche 1901-01-01 00:00:00.
jetzt Mein Problem ist, dass ich keine Möglichkeit zu erstellen ein ptime
Objekt mit 64-Bit-Integer habe - was auf meinem 32-Bit-System den ticks
Teil der time_duration
Objekte ist privat und ich bin beschränkt long
zu verwenden ist nur ein 4-Byte-Ganzzahl mit Vorzeichen, die nicht groß genug ist, um den Sekundenoffset meiner Epoche zu speichern.
Ich habe keine Kontrolle über den Wert der Epoche und so bin ich wirklich ratlos, wie ich mein benötigtes boost::posix_time::ptime
Objekt aus den Daten, die ich habe, erstellen kann. Ich kann wahrscheinlich eine schmutzige Lösung erhalten, indem ich harte Sekundenzählungen zu bestimmten Zeitintervallen berechne und eine zusätzliche Epoche benutze, um eine Brücke zu bilden, aber ich frage mich, ob es etwas im boost
Code gibt, der mir erlaubt, das Problem vollständig zu lösen Verwenden der Boost-Datetime-Bibliothek. Ich habe alle Dokumente gelesen, die ich finden kann, aber ich kann keinen offensichtlichen Weg sehen, dies zu tun.
EDIT: Ich fand diese Frage im Zusammenhang Convert int64_t to time_duration aber die akzeptierte Antwort für meine Epoche funktioniert NICHT
Danke für die Antwort. Ich habe eine ähnliche Sache selbst gemacht, ich habe nur auf eine Lösung mit Boost gehofft, anstatt um die Runden zu kommen. Ich denke, das Fehlen von Antworten deutet darauf hin, dass es keine gibt. Ich akzeptiere deine Antwort, wenn in ein paar Tagen nichts anderes mehr auftaucht. – mathematician1975
Es ist erstaunlich, dass dies im Oktober 2014 in C++ (sogar mit Boost) geschehen muss. Warum wurden diese Typen nicht schon vor 64 Bit umgestellt? –
@DanNissenbaum Ich habe es mit deiner Antwort getestet und es ist viel eleganter! ** [Coliru] (http://coliru.stacked-crooked.com/a/a0be0c728be95b1f) ** – sehe