方法 : TimeZoneInfo オブジェクトをインスタンス化する

TimeZoneInfo オブジェクトをインスタンス化する最も一般的な方法は、レジストリからオブジェクトに関する情報を取得することです。 このトピックでは、ローカル システムのレジストリから TimeZoneInfo オブジェクトをインスタンス化する方法について説明します。

TimeZoneInfo オブジェクトをインスタンス化するには

  1. TimeZoneInfo オブジェクトを宣言します。

  2. static (Visual Basic では Shared) TimeZoneInfo.FindSystemTimeZoneById メソッドを呼び出します。

  3. メソッドからスローされる例外 (特に、タイム ゾーンがレジストリで定義されていない場合にスローされる TimeZoneNotFoundException) を処理します。

使用例

次のコードでは、東部標準時ゾーンを表す TimeZoneInfo オブジェクトを取得し、現地時刻に対応する東部標準時の時刻を表示します。

Dim timeNow As Date = Date.Now
Try
   Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
   Dim easternTimeNow As Date = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, easternZone)
   Console.WriteLine("{0} {1} corresponds to {2} {3}.", _
                     timeNow, _
                     IIf(TimeZoneInfo.Local.IsDaylightSavingTime(timeNow), _
                         TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), _
                     easternTimeNow, _
                     IIf(easternZone.IsDaylightSavingTime(easternTimeNow), _
                         easternZone.DaylightName, easternZone.StandardName))
' Handle exception
'
' As an alternative to simply displaying an error message, an alternate Eastern
' Standard Time TimeZoneInfo object could be instantiated here either by restoring
' it from a serialized string or by providing the necessary data to the
' CreateCustomTimeZone method.
Catch e As TimeZoneNotFoundException
   Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.")
Catch e As InvalidTimeZoneException
   Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.")   
Catch e As SecurityException
   Console.WriteLine("The application lacks permission to read time zone information from the registry.")
Catch e As OutOfMemoryException
   Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.")
' If we weren't passing FindSystemTimeZoneById a literal string, we also 
' would handle an ArgumentNullException.
End Try
DateTime timeNow = DateTime.Now;
try
{
   TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
   DateTime easternTimeNow = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, 
                                                   easternZone);
   Console.WriteLine("{0} {1} corresponds to {2} {3}.",
                     timeNow, 
                     TimeZoneInfo.Local.IsDaylightSavingTime(timeNow) ?
                               TimeZoneInfo.Local.DaylightName : 
                               TimeZoneInfo.Local.StandardName,
                     easternTimeNow, 
                     easternZone.IsDaylightSavingTime(easternTimeNow) ?
                                 easternZone.DaylightName : 
                                 easternZone.StandardName);
}
// Handle exception
//
// As an alternative to simply displaying an error message, an alternate Eastern
// Standard Time TimeZoneInfo object could be instantiated here either by restoring
// it from a serialized string or by providing the necessary data to the
// CreateCustomTimeZone method.
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.");
}  
catch (InvalidTimeZoneException)
{
   Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.");
}
catch (SecurityException)
{
   Console.WriteLine("The application lacks permission to read time zone information from the registry.");
}
catch (OutOfMemoryException)
{
   Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.");
}
// If we weren't passing FindSystemTimeZoneById a literal string, we also 
// would handle an ArgumentNullException.

TimeZoneInfo.FindSystemTimeZoneById メソッドの唯一のパラメーターは、取得するタイム ゾーンの ID です。これは、オブジェクトの TimeZoneInfo.Id プロパティに対応します。 タイム ゾーン ID は、タイム ゾーンを一意に識別するキー フィールドです。 多くのキーが比較的短いものであるのに対し、タイム ゾーン ID はいくぶん長めです。 ほとんどの場合、ID の値は、タイム ゾーンの標準時刻の名前を表すために使用される TimeZoneInfo オブジェクトの StandardName プロパティに対応します。 ただし、例外もあります。 有効な ID を指定していることを確認する最良の方法は、システムで使用できるタイム ゾーンを列挙し、表示されるタイム ゾーンの ID を記録することです。 概要については、「方法 : コンピューター上に存在するタイム ゾーンを列挙する」を参照してください。 「ローカル システムで定義されているタイム ゾーンの検索」トピックにも、一部のタイム ゾーン ID の一覧があります。

タイム ゾーンが見つかると、メソッドは TimeZoneInfo オブジェクトを返します。 タイム ゾーンが見つからない場合は、メソッドから TimeZoneNotFoundException がスローされます。 タイム ゾーンが見つかっても、そのデータが壊れているか不完全な場合は、メソッドから InvalidTimeZoneException がスローされます。

アプリケーションが依存するタイム ゾーンが必ず存在していなければならない場合は、最初に FindSystemTimeZoneById メソッドを呼び出して、レジストリからタイム ゾーンの情報を取得する必要があります。 メソッドの呼び出しが失敗した場合は、例外ハンドラーで、タイム ゾーンの新しいインスタンスを作成するか、シリアル化された TimeZoneInfo オブジェクトを逆シリアル化してインスタンスを作成し直す必要があります。 例については、「方法 : 埋め込みリソースからタイム ゾーンを復元する」を参照してください。

コードのコンパイル

この例で必要な要素は次のとおりです。

  • System.Core.dll への参照をプロジェクトに追加する。

  • System 名前空間を using ステートメントでインポートする (C# のコードで必要)。

参照

処理手順

方法 : 定義済みの UTC オブジェクトおよびローカル タイム ゾーン オブジェクトにアクセスする

概念

ローカル システムで定義されているタイム ゾーンの検索

その他の技術情報

日付、時刻、およびタイム ゾーン