次の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
、どのようにしてstrftime
2枚に異なる方法で応答するために知っているstruct tm
オブジェクト?ない限り、tm
のようないくつかの情報が含まれ、これはtm
によって作成されlocaltime
、そのtm
ことによって作成されますgmtime
。
tm
構造体は、タイムゾーンに関する情報が格納されていない、あなたはそれが何だと思いますか?違いは、とへの呼び出しにgmtime()
ありlocaltime()
ます。
strftime
吸盤を区別する方法を探しています。POSIXは何が起こるかを未定義のままにしておく必要があります。
tm
、追加の情報を含む非標準のsを見たことを思い出しました。こちらが1つです。const char *tm_zone
メンバーに注意してください。どのプラットフォーム用にコンパイルしていますか?見てみましょうtm
、彼らは構造を拡張しましたかどうかを確認するために実施。
tm
タイムゾーン情報は含まれていません。strftime
舞台裏のブードゥー教によってタイムゾーンを取得します。一般的にタイムゾーンを取得したい場合、それは少し混乱しています。(現在)タイムゾーンを取得する標準的な方法はありません。幸いハワードヒナントは、そのジョブにあります...。