DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

タイムゾーンを取得する

注意:ローカル時刻やUTCへの変換に関する説明は、「ローカル時刻を世界協定時刻(UTC)に変換する」に移動しました。

.NET Framework 3.5以降で、TimeZoneInfoクラスを使用する

.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メソッドで取得できます)の適用もしません。

以下に、ローカルタイムゾーンの情報を表示する例を示します。

VB.NET
コードを隠すコードを選択
'ローカルタイムゾーンの情報を持つ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
C#
コードを隠すコードを選択
//ローカルタイムゾーンの情報を持つ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を出力する例を示します。

VB.NET
コードを隠すコードを選択
'ローカルコンピュータで定義されているすべてのタイムゾーンを列挙する
For Each tzi As System.TimeZoneInfo In System.TimeZoneInfo.GetSystemTimeZones()
    Console.WriteLine(tzi.Id)
Next
C#
コードを隠すコードを選択
//ローカルコンピュータで定義されているすべてのタイムゾーンを列挙する
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オブジェクトを取得する

TimeZoneInfo.FindSystemTimeZoneByIdメソッドを使えば、タイムゾーンIDを指定してTimeZoneInfoオブジェクトを取得することができます。

指定したIDのタイムゾーンが見つからなかった場合は、例外TimeZoneNotFoundExceptionがスローされます。IDが見つかってもデータが壊れている場合は、例外InvalidTimeZoneExceptionがスローされます。

ID以外でタイムゾーンを探したい時は、TimeZoneInfo.GetSystemTimeZonesで取得できるTimeZoneInfoのコレクションから自分で探します。

ローカルコンピュータに定義されていないタイムゾーンであれば、TimeZoneInfo.CreateCustomTimeZoneメソッドを使って自分で作成するか、もしTimeZoneInfo.ToSerializedStringメソッドでシリアル化された文字列があればTimeZoneInfo.FromSerializedStringメソッドで復元できます。

IDが「Tokyo Standard Time」のTimeZoneInfoを取得する例を示します。

VB.NET
コードを隠すコードを選択
'IDが「Tokyo Standard Time」のタイムゾーンを取得する
Dim tokyoTimeZone As System.TimeZoneInfo = _
    System.TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time")

Console.WriteLine(tokyoTimeZone.DisplayName)
'(UTC+09:00) 大阪、札幌、東京
C#
コードを隠すコードを選択
//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クラスを使用する

.NET Framework 2.0以前では、タイムゾーンに関する情報はTimeZoneクラスで取得できます。現在のコンピュータシステムのタイムゾーンは、CurrentTimeZoneプロパティで取得できます。

UTCオフセットは、TimeZone.GetUtcOffsetメソッドで取得できます。

以下の例では、ローカルコンピュータのTimeZoneオブジェクトを取得し、現在の時間でのUTCオフセットを取得しています。

VB.NET
コードを隠すコードを選択
'現在の世界協定時刻(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
C#
コードを隠すコードを選択
//ローカルコンピュータのTimeZoneオブジェクトを取得する
System.TimeZone tz = System.TimeZone.CurrentTimeZone;
//現在のUTCオフセットを取得する
TimeSpan utcOffset = tz.GetUtcOffset(DateTime.Now);

Console.WriteLine("GetUtcOffset:{0}", utcOffset);
//GetUtcOffset:09:00:00

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。