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 nowist ein eindeutiger Integralwert, während localund gmsind , struct tmdass Speicher für Menschen lesbaren Datum / Uhrzeit. Dann drucke ich die formatierten Informationen (Zeitzone) nur basierend auf den struct tmObjekten aus.
Gemäß der cplusplus Referenz der Datenelemente struct tmsind ,
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 tmenthält, woher weiß das Programm, dass die Zeitzoneninformationen daraus stammen? Das heißt, woher weiß es, dass die Zeitzone HKTfür localund die Zeitzone UTCfür ist gm?
Wenn das nicht alles ist, was ein struct tmenthä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.
tmWoher strftimeweiß man angesichts aller darin gespeicherten Informationen , wie man auf zwei struct tmObjekte unterschiedlich reagiert ? Es sei denn , tmenthält einige Informationen wie diese tmerstellt wirdlocaltime , die tmerstellt wirdgmtime .
tmStruktur speichert keine Zeitzonen-Infos. Warum glauben Sie, dass dies der Fall ist? Der Unterschied liegt eher in den Anrufen zu gmtime()und localtime().
strftimedie Saugnäpfe auseinanderhalten. Sollte hinzufügen, dass POSIX das, was passiert, undefiniert lässt.
tms mit zusätzlichen Informationen gesehen hatte. Hier ist einer . Beachten Sie das const char *tm_zoneMitglied. Für welche Plattform kompilieren Sie? Schauen Sie sich die tmImplementierung an, um festzustellen, ob sie die Struktur erweitert hat.
tmenthält keine Zeitzoneninformationen.strftimeErhä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 ... .