2016-07-21 9 views
0

Ich habe eine Client-Java-Bibliothek, die ISO-Zeitstempel mit Zeitzone mit Joda-Time-Bibliothek analysiert und einen langen Wert (Millisekunden seit Epoche in UTC) zurückgibt. Ich muss ein serverseitiges Framework (in C++) entwickeln, das Millisekunden seit der Epoche verwendet und Zeitstempel in einer beliebigen Zeitzone erzeugt (z. B. "Europa/Zürich"). Ich kann local_date_time Option wie folgt verwenden:Konvertieren Zeitstempel in Millisekunden in eine Zeitzone in Boost

posix_time ptime = epoch(date(1970,1,1)) + ms; //ms sent from client 
tz_database tz; 
tz.load_from_file(/*path to date_time_zonespec.csv*/); 
time_zone_ptr ptr = tz.time_zone_from_region(regionStr); //regionStr = Europe/Zurich 
local_date_time mytime(ptime, ptr); 

Allerdings habe ich von diesem Posten gelernt (C++: Will you choose boost::date_time or icu::date/time library?), dass boost :: date_time Zeitzonen-Unterstützung ist gebrochen. Eine bessere Option ist boost :: locale. Gibt es einen Weg zu den gleichen Schritten wie oben mit boost :: locale? Ich suchte online nach Beispielen mit boost :: Locale, konnte aber kein ähnliches Beispiel finden.

Antwort

2

diese free, open-source C++11/14 timezone library könnte vielleicht helfen:

#include "tz.h" 
#include <iostream> 

date::zoned_time<std::chrono::milliseconds> 
convert(date::sys_time<std::chrono::milliseconds> tp) 
{ 
    return date::make_zoned(date::locate_zone("Europe/Zurich"), tp); 
} 

int 
main() 
{ 
    using namespace std::chrono; 
    std::cout << convert(date::floor<milliseconds>(system_clock::now())) << '\n'; 
    std::cout << convert(date::sys_time<milliseconds>{1469137715906ms}) << '\n'; 
} 

Dies ist nur Ausgang für mich:

2016-07-21 23:48:35.906 CEST 
2016-07-21 23:48:35.906 CEST 

Es oben auf der C++ 14.11 <chrono> Bibliothek gebaut wird. std::chrono::system_clock misst Zeit seit 1970-01-01 UTC. Die Zeitzonenbibliothek hilft dabei, diese in lokalisierte Zeitzonen zu übersetzen, indem IANA timezone database verwendet wird.

Fully documented, einfach zu bedienen. Hochleistung. Fängt viele Fehler zur Kompilierzeit.

Examples and Recipes.

+0

Vielen Dank für Ihre Antwort. Leider kann ich C++ 11/14 nicht verwenden, da dafür die vorhandene Codebasis portiert werden muss. –

+0

@SantanuC: Fair genug, und meine Sympathien über Sie auf C++ 98/03 stecken. :-) –