So geht's mit Howard Hinnant's date library. Dies ist eine kostenlose MIT-Lizenz C++ 14.11 Bibliothek basierend auf <chrono>
:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace std::chrono_literals;
using namespace date;
auto unix_timestamp = sys_seconds{1479664467s};
auto zt = make_zoned("America/Los_Angeles", unix_timestamp);
auto wd = weekday{floor<days>(zt.get_local_time())};
std::cout << wd << '\n';
}
Die erste Zeile nur konstruiert den Unix-Zeitstempel (die Sie aus anderen Quellen haben können). In C++ 11 haben wir nicht die chrono Literale und so würde diese Linie stattdessen sein:
auto unix_timestamp = sys_seconds{seconds{1479664467}};
make_zoned()
schafft eine zoned_time<seconds>
basierend auf dem unix_timestamp
und den time_zone
„Amerika/Los_Angeles“. A zoned_time
ist eine Sammlung von time_zone
und Unix-Zeitstempel.
Sie können die lokale Zeit von zoned_time
mit zt.get_local_time()
abrufen. Dies ist ein chrono::time_point
, aber ohne Uhr damit verbunden. Die Genauigkeit dieses Zeitpunkts entspricht der Genauigkeit Ihres ursprünglichen Zeitstempels (in diesem Fall in Sekunden).
Sie können den lokalen Tag der Woche der local_time
erhalten, indem die local_time
mit einer Genauigkeit von days
Kürzen:
floor<days>(zt.get_local_time())
Und diese Tag-Präzision time_point
konvertieren weekday
eingeben.
Ein weekday
kann ausgedruckt werden, an weekday
Arithmetik und Vergleichen teilnehmen oder explizit in einen unsigned
im Bereich [0, 6] konvertiert werden.
Das Programm über Ausgänge:
Sun
Die Zeitzone Teil dieser Bibliothek ist eine getreue Darstellung der IANA timezone database. Es wird korrekte Anpassungen zwischen lokalen Zeitzonen und UTC bis in die Mitte des 19. Jahrhunderts bis zum heutigen Tag geben. Wenn Sie die Bibliothekszeitstempel vor der Mitte des 19. Jahrhunderts übergeben, wird der früheste bekannte UTC-Offset rückwärts auf das Jahr -32768 extrapoliert. Sie können Zeitstempel auch so weit in der Zukunft wie das Jahr 32767 übergeben und die aktuellen Offset- und Sommerzeit-Regeln werden weiter verbreitet.
Da diese Bibliothek auf <chrono>
aufgebaut ist, wird sie jede Präzision verarbeiten, die <chrono>
liefert. Beachten Sie, dass einige chrono::duration
s wie nanoseconds
einen eingeschränkteren Bereich haben (+/- 292 Jahre für nanoseconds
).
Die Bibliothek/der Prozess ist threadsicher. Das heißt, das Programm arbeitet direkt mit der von Ihnen angegebenen Zeitzone, ohne die Zeitzone oder Umgebungsvariablen Ihres Computers unter der Haube zu ändern. Es beinhaltet auch nicht den Teil der C-Timing-API, von dem bekannt ist, dass er nicht threadsicher ist, weil die lokale Statik nicht konstant ist.
Portiert auf die neuesten Versionen von gcc, clang und VS.
Ich habe Sie nicht abgelehnt, aber wie wäre es mit ['std :: localtime'] (http://en.cppreference.com/w/cpp/chrono/c/localtime)? – Danh
Danke - was ist, wenn die lokale Zeit nicht PT für mich ist? –
[strftime] (http://en.cppreference.com/w/cpp/chrono/c/strftime). Oder [time_put] (http://en.cppreference.com/w/cpp/locale/time_put). Oder [Howard Hinnants Datum] (https://github.com/HowardHinnant/date) - Zeiger, keine Antworten, deshalb ein Kommentar. –