注意:ローカル時刻やUTCへの変換に関する説明は、「ローカル時刻を世界協定時刻(UTC)に変換する」に移動しました。
.NET Framework 3.5以降では、TimeZoneInfoクラスを使ってタイムゾーンに関する情報を取得できます。後述するTimeZoneクラスより機能が拡張されており、.NET Framework 3.5以降ではTimeZoneよりTimeZoneInfoの使用が推奨されています。ただしTimeZoneInfoクラスはWindows XP SP2以降のOSでしか使用できません。
現在のコンピュータシステムのタイムゾーンは、TimeZoneInfo.Localプロパティで取得できます。(UTCのタイムゾーンは、TimeZoneInfo.Utcプロパティで取得できます。)
指定した時刻でのUTCオフセット(タイムゾーン標準時とUTCとの差、時差)は、GetUtcOffsetメソッドを使って取得することができます。またはBaseUtcOffsetプロパティで取得することも出来ますが、この場合は、UTCとタイムゾーン標準時との時差となり、タイムゾーンの調整規則(TimeZoneInfo.GetAdjustmentRulesメソッドで取得できます)の適用もしません。
以下に、ローカルタイムゾーンの情報を表示する例を示します。
'ローカルタイムゾーンの情報を持つTimeZoneInfoを取得する Dim tzi As System.TimeZoneInfo = System.TimeZoneInfo.Local '情報を表示する Console.WriteLine("ID: {0}", tzi.Id) Console.WriteLine("標準表示名: {0}", tzi.DisplayName) Console.WriteLine("標準時の表示名: {0}", tzi.StandardName) Console.WriteLine("夏時間の表示名: {0}", tzi.DaylightName) Console.WriteLine("夏時間規則があるか: {0}", tzi.SupportsDaylightSavingTime) Console.WriteLine("UTCオフセット: {0}", tzi.BaseUtcOffset) Console.WriteLine("現在の時刻でのUTCオフセット: {0}", tzi.GetUtcOffset(DateTime.Now)) 'ID: Tokyo Standard Time '標準表示名: (UTC+09:00) 大阪、札幌、東京 '標準時の表示名: 東京 (標準時) '夏時間の表示名: 東京 (夏時間) '夏時間規則があるか: False 'UTCオフセット: 09:00:00 '現在の時刻でのUTCオフセット: 09:00:00
//ローカルタイムゾーンの情報を持つTimeZoneInfoを取得する System.TimeZoneInfo tzi = System.TimeZoneInfo.Local; //情報を表示する Console.WriteLine("ID: {0}", tzi.Id); Console.WriteLine("標準表示名: {0}", tzi.DisplayName); Console.WriteLine("標準時の表示名: {0}", tzi.StandardName); Console.WriteLine("夏時間の表示名: {0}", tzi.DaylightName); Console.WriteLine("夏時間規則があるか: {0}", tzi.SupportsDaylightSavingTime); Console.WriteLine("UTCオフセット: {0}", tzi.BaseUtcOffset); Console.WriteLine("現在の時刻でのUTCオフセット: {0}", tzi.GetUtcOffset(DateTime.Now)); //ID: Tokyo Standard Time //標準表示名: (UTC+09:00) 大阪、札幌、東京 //標準時の表示名: 東京 (標準時) //夏時間の表示名: 東京 (夏時間) //夏時間規則があるか: False //UTCオフセット: 09:00:00 //現在の時刻でのUTCオフセット: 09:00:00
ローカルコンピュータで定義されているすべてのタイムゾーン(レジストリの HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones キーに格納されているタイムゾーン)を取得するには、TimeZoneInfo.GetSystemTimeZonesメソッドを使います。
ローカルコンピュータで定義されているすべてのタイムゾーンを列挙し、IDを出力する例を示します。
'ローカルコンピュータで定義されているすべてのタイムゾーンを列挙する For Each tzi As System.TimeZoneInfo In System.TimeZoneInfo.GetSystemTimeZones() Console.WriteLine(tzi.Id) Next
//ローカルコンピュータで定義されているすべてのタイムゾーンを列挙する foreach (System.TimeZoneInfo tzi in System.TimeZoneInfo.GetSystemTimeZones()) { Console.WriteLine(tzi.Id); }
出力例は、以下のようになります。
Dateline Standard Time Samoa Standard Time UTC-11 Hawaiian Standard Time Alaskan Standard Time Pacific Standard Time (Mexico) Pacific Standard Time US Mountain Standard Time Mountain Standard Time (Mexico) Mountain Standard Time Central Standard Time (Mexico) Canada Central Standard Time Central America Standard Time Central Standard Time US Eastern Standard Time SA Pacific Standard Time Eastern Standard Time Venezuela Standard Time Paraguay Standard Time Central Brazilian Standard Time Pacific SA Standard Time SA Western Standard Time Atlantic Standard Time Newfoundland Standard Time SA Eastern Standard Time Greenland Standard Time Argentina Standard Time E. South America Standard Time Montevideo Standard Time Mid-Atlantic Standard Time UTC-02 Azores Standard Time Cape Verde Standard Time Morocco Standard Time GMT Standard Time Greenwich Standard Time UTC W. Europe Standard Time Namibia Standard Time Central European Standard Time Romance Standard Time Central Europe Standard Time W. Central Africa Standard Time GTB Standard Time Jordan Standard Time Turkey Standard Time Israel Standard Time Egypt Standard Time Syria Standard Time South Africa Standard Time FLE Standard Time Middle East Standard Time E. Europe Standard Time Kaliningrad Standard Time Arab Standard Time E. Africa Standard Time Arabic Standard Time Iran Standard Time Arabian Standard Time Caucasus Standard Time Georgian Standard Time Azerbaijan Standard Time Mauritius Standard Time Russian Standard Time Afghanistan Standard Time Pakistan Standard Time West Asia Standard Time Sri Lanka Standard Time India Standard Time Nepal Standard Time Central Asia Standard Time Ekaterinburg Standard Time Bangladesh Standard Time Myanmar Standard Time N. Central Asia Standard Time SE Asia Standard Time Ulaanbaatar Standard Time Singapore Standard Time North Asia Standard Time W. Australia Standard Time China Standard Time Taipei Standard Time North Asia East Standard Time Korea Standard Time Tokyo Standard Time Cen. Australia Standard Time AUS Central Standard Time AUS Eastern Standard Time West Pacific Standard Time E. Australia Standard Time Tasmania Standard Time Yakutsk Standard Time Vladivostok Standard Time Central Pacific Standard Time New Zealand Standard Time Fiji Standard Time Kamchatka Standard Time Magadan Standard Time UTC+12 Tonga Standard Time
TimeZoneInfo.FindSystemTimeZoneByIdメソッドを使えば、タイムゾーンIDを指定してTimeZoneInfoオブジェクトを取得することができます。
指定したIDのタイムゾーンが見つからなかった場合は、例外TimeZoneNotFoundExceptionがスローされます。IDが見つかってもデータが壊れている場合は、例外InvalidTimeZoneExceptionがスローされます。
ID以外でタイムゾーンを探したい時は、TimeZoneInfo.GetSystemTimeZonesで取得できるTimeZoneInfoのコレクションから自分で探します。
ローカルコンピュータに定義されていないタイムゾーンであれば、TimeZoneInfo.CreateCustomTimeZoneメソッドを使って自分で作成するか、もしTimeZoneInfo.ToSerializedStringメソッドでシリアル化された文字列があればTimeZoneInfo.FromSerializedStringメソッドで復元できます。
IDが「Tokyo Standard Time」のTimeZoneInfoを取得する例を示します。
'IDが「Tokyo Standard Time」のタイムゾーンを取得する Dim tokyoTimeZone As System.TimeZoneInfo = _ System.TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time") Console.WriteLine(tokyoTimeZone.DisplayName) '(UTC+09:00) 大阪、札幌、東京
//IDが「Tokyo Standard Time」のタイムゾーンを取得する System.TimeZoneInfo tokyoTimeZone = System.TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"); Console.WriteLine(tokyoTimeZone.DisplayName); //(UTC+09:00) 大阪、札幌、東京
.NET Framework 2.0以前では、タイムゾーンに関する情報はTimeZoneクラスで取得できます。現在のコンピュータシステムのタイムゾーンは、CurrentTimeZoneプロパティで取得できます。
UTCオフセットは、TimeZone.GetUtcOffsetメソッドで取得できます。
以下の例では、ローカルコンピュータのTimeZoneオブジェクトを取得し、現在の時間でのUTCオフセットを取得しています。
'現在の世界協定時刻(UTC: Coordinated Universal Time)オフセットの取得 'ローカルコンピュータのTimeZoneオブジェクトを取得する Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone '現在のUTCオフセットを取得する Dim utcOffset As TimeSpan = tz.GetUtcOffset(DateTime.Now) Console.WriteLine("GetUtcOffset:{0}", utcOffset) 'GetUtcOffset:09:00:00
//ローカルコンピュータのTimeZoneオブジェクトを取得する System.TimeZone tz = System.TimeZone.CurrentTimeZone; //現在のUTCオフセットを取得する TimeSpan utcOffset = tz.GetUtcOffset(DateTime.Now); Console.WriteLine("GetUtcOffset:{0}", utcOffset); //GetUtcOffset:09:00:00
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。