時差のお話

VC++の場合、世界協定時刻(UTC)とローカル時刻の時差は、GetTimeZoneInformation関数を使うことで求められる。

TIME_ZONE_INFORMATION tzi;
GetTimeZoneInformation(&tzi);

// UTCからの差(分単位)を取得し符号反転
int wBias = -(tzi.Bias);

printf("時差=%+02d:%02d\n",
    wBias/60,   // 時
    wBias%60);  // 分

これを実行すると、日本では「時差=+09:00」、中央アメリカでは「時差=-6:00」と表示される。

注意すべきところは、5行目のBiasの値。
この値は、TIME_ZONE_INFORMATION構造体に返される時差(分単位)だが、UTCから進んでいる時間差ではなく、ローカル時間をどれだけ調整すればUTCになるかという値。
式で言うと「UTC = ローカル時刻 + バイアス値(時差)」で、これのバイアス値(時差)の値を指している。

なので、日本の場合、時差+9時間だが、ここのバイアス値として返される値は-540分(-9時間)となる。

そのまま時差として使用すると、+-が逆転してしまうので、符号反転する必要がある。
ちなみに符号反転は、「A = -A」というような式で可能。

あと、気になったのが、Windowsの[タイムゾーンの設定]で表示される時差の範囲は-12時間~+13時間。

はて、何故 +13時間?
+13時間って、-11時間のこと?

調べてみると、ヌクアロファ(トンガ王国)という所が、時差+13時間になるらしい。
で、地図で調べてみるとなるほど。

日付変更線が曲がっている所だった。

そういう落ちがあったのね。

もう1つ。
UTC(Coordinated Universal Time:協定世界時)とGMT(Greenwich Mean Time:グリニッジ標準時)の違い。
一体何なんだ?

Windowsの日付と時刻の設定ダイアログでは「GMT+09:00」とか表示される。
けど、GetTimeZoneInformation関数は、UTCで返すとマニュアルには書いてある。

何だかよく分からんが、ちょいと考え方の違いがあり誤差があるようだが、まぁ大した違いは無いらしい。
特にPCで使う範囲なら同意と考えても問題無さそう。

Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*