次のC ++コードを検討してください。
#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;
}
だから、中に格納されてnowいる間、明確な積分値であるlocalとgmされstruct tmている店舗の人間が読める日付/時刻情報。次に、struct tmオブジェクトのみに基づいてフォーマットされた情報(タイムゾーン)を出力します。
cplusplus リファレンスによると、のデータメンバーstruct tmは
tm_sec
tm_min
tm_hour
tm_mday
tm_mon
tm_year
tm_wday
tm_yday
tm_isdst
それがaにstruct tm含まれているすべての場合、プログラムはどのようにしてそれからタイムゾーン情報を認識しますか?つまり、それはどのようにタイムゾーンがあることを知っているHKTためlocal、タイムゾーンがあることUTCのためにgm?
それだけではない場合struct tmは、タイムゾーン情報の格納方法を説明してください。
ちなみに、デモコードはC ++ですが、この質問は本質的には正当なCの質問でもあると思います。
tm、どのようにしてstrftime2枚に異なる方法で応答するために知っているstruct tmオブジェクト?ない限り、tmのようないくつかの情報が含まれ、これはtmによって作成されlocaltime、そのtmことによって作成されますgmtime。
tm構造体は、タイムゾーンに関する情報が格納されていない、あなたはそれが何だと思いますか?違いは、とへの呼び出しにgmtime()ありlocaltime()ます。
strftime吸盤を区別する方法を探しています。POSIXは何が起こるかを未定義のままにしておく必要があります。
tm、追加の情報を含む非標準のsを見たことを思い出しました。こちらが1つです。const char *tm_zoneメンバーに注意してください。どのプラットフォーム用にコンパイルしていますか?見てみましょうtm、彼らは構造を拡張しましたかどうかを確認するために実施。
tmタイムゾーン情報は含まれていません。strftime舞台裏のブードゥー教によってタイムゾーンを取得します。一般的にタイムゾーンを取得したい場合、それは少し混乱しています。(現在)タイムゾーンを取得する標準的な方法はありません。幸いハワードヒナントは、そのジョブにあります...。