タイムゾーンの一覧取得について

      2016/08/09

タイムゾーン(time zone)とは

タイムゾーン(time zone)は、「地域の標準時を示すUTCとの時間差」でWindowsなどで設定する情報です。

プログラムで時刻を取得・変更するWindows APIはよく使われますが、この「タイムゾーンを取得・変更する」ということはめったにありません。

タイムゾーンを取得・変更するWindows API
タイムゾーンを取得・変更するWindows APIには

  • GetTimeZoneInformation関数(現在設定しているタイムゾーンを取得する)
  • SetTimeZoneInformation(タイムゾーンを設定する)

がありますが、実はこのAPIを呼ぶだけでは意味がありません。

それは、この2つのAPIは引数に同じ構造体を渡す関数なのですが、

  1. GetTimeZoneInformation関数で現在のタイムゾーンを取得する。
  2. SetTimeZoneInformation関数にGetTimeZoneInformationで取得したタイムゾーンを設定する。

とするだけでは、1.で取得したタイムゾーンは、現在設定されているタイムゾーンなのでタイムゾーンは変更されません。

タイムゾーンを変更するには、変更するための「タイムゾーンの一覧」がないといけないのです。

 

タイムゾーンの一覧はどこ?

タイムゾーンの一覧はレジストリにあります。
ただ、レジストリキーが

NT系Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
非NT系Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones

と2種類あるのですが、現行のWindows OSはほとんどがNT系Windowsになっているので

NT系Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

にあります。
(NT系Windowsの”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\”には”Time Zones”はないのでご注意を!!)

 

実際にタイムゾーンの一覧を取得してみる

下記のようなサンプルコードを書いて、Windows 10上で動かしてみました。

 

 

実行した結果です。

実行画面1-1

Indexの値が異常です。
レジストリエディタでチェックしてみました。

Win10_Reg-1
レジストリに”Index”という値がありません。
「コードが間違えているのか?」と思い、たまたま残っていたWindows XPのPCのほうで同じレジストリを見てみました。

WinXP_Reg-1

“Index”という値がちゃんとあります。

Windows OSがバージョンアップした時に、”Index”というレジストリ値は使えなくなっていたようです。

UTCからの時差を取り扱っている’Bias’という情報は、単位は’分’なので今回は’時(hour)’で表示するようにコードを下記のように変更しました。

 

 

下記が実行した結果です。

 

実行画面2-1

うまく、タイムゾーンの一覧を取得して、UTCからの時間差も取得されました。

 

 - 未分類