Betrachten Sie den folgenden C ++ - Code
#include <ctime>
#include <iostream>
int main()
{
std::time_t now = std::time(nullptr);
struct tm local = *std::localtime(&now);
struct tm gm = *std::gmtime(&now);
char str[20];
std::strftime(str, 20, "%Z", &local);
std::cout << str << std::endl; // HKT
std::strftime(str, 20, "%Z", &gm);
std::cout << str << std::endl; // UTC
return 0;
}
So gespeichert now
ist ein eindeutiger Integralwert, während local
und gm
sind , struct tm
dass Speicher für Menschen lesbaren Datum / Uhrzeit. Dann drucke ich die formatierten Informationen (Zeitzone) nur basierend auf den struct tm
Objekten aus.
Gemäß der cplusplus Referenz der Datenelemente struct tm
sind ,
tm_sec
tm_min
tm_hour
tm_mday
tm_mon
tm_year
tm_wday
tm_yday
tm_isdst
Wenn das alles ist, was a struct tm
enthält, woher weiß das Programm, dass die Zeitzoneninformationen daraus stammen? Das heißt, woher weiß es, dass die Zeitzone HKT
für local
und die Zeitzone UTC
für ist gm
?
Wenn das nicht alles ist, was ein struct tm
enthält, erklären Sie bitte, wie es Zeitzoneninformationen speichert.
Übrigens, obwohl der Demo-Code in C ++ ist, denke ich, dass diese Frage im Wesentlichen auch eine legitime C-Frage ist.
tm
Woher strftime
weiß man angesichts aller darin gespeicherten Informationen , wie man auf zwei struct tm
Objekte unterschiedlich reagiert ? Es sei denn , tm
enthält einige Informationen wie diese tm
erstellt wirdlocaltime
, die tm
erstellt wirdgmtime
.
tm
Struktur speichert keine Zeitzonen-Infos. Warum glauben Sie, dass dies der Fall ist? Der Unterschied liegt eher in den Anrufen zu gmtime()
und localtime()
.
strftime
die Saugnäpfe auseinanderhalten. Sollte hinzufügen, dass POSIX das, was passiert, undefiniert lässt.
tm
s mit zusätzlichen Informationen gesehen hatte. Hier ist einer . Beachten Sie das const char *tm_zone
Mitglied. Für welche Plattform kompilieren Sie? Schauen Sie sich die tm
Implementierung an, um festzustellen, ob sie die Struktur erweitert hat.
tm
enthält keine Zeitzoneninformationen.strftime
Erhält die Zeitzone durch Voodoo hinter den Kulissen. Wenn Sie die Zeitzone im Allgemeinen erhalten möchten, ist das ein bisschen chaotisch. Es gibt ( derzeit ) keine Standardmethode, um eine Zeitzone zu erhalten. Zum Glück Howard Hinnant ist auf diesem Job ... .