方法: TimeZoneInfo オブジェクトを取得する

TimeZoneInfo オブジェクトを取得する最も一般的な方法は、レジストリからそれに関する情報を取得することです。 オブジェクトを取得するには、レジストリ内を検索する static (Visual Basic では Shared) TimeZoneInfo.FindSystemTimeZoneById メソッドを呼び出します。 メソッドによってスローされる例外 (特に、タイム ゾーンがレジストリで定義されていない場合にスローされる TimeZoneNotFoundException) を処理します。

Note

.NET 8 以降では、TimeZoneInfo.FindSystemTimeZoneById は、新しいオブジェクトをインスタンス化するのではなく、キャッシュされた TimeZoneInfo オブジェクトを返します。 詳細については、「FindSystemTimeZoneById が新しいオブジェクトを返さない」を参照してください。

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

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.
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

TimeZoneInfo.FindSystemTimeZoneById メソッドの唯一のパラメーターは、取得するタイム ゾーンの識別子です。これは、オブジェクトの TimeZoneInfo.Id プロパティに対応します。 タイム ゾーン ID は、タイム ゾーンを一意に識別するキー フィールドです。 ほとんどのキーは比較的短いですが、タイム ゾーン ID はいくぶん長めです。 ほとんどの場合、ID の値は、タイム ゾーンの標準時刻の名前を表すために使用される StandardName オブジェクトの TimeZoneInfo プロパティに対応します。 ただし、例外もあります。 有効な識別子を確実に指定する最良の方法は、システムで使用できるタイム ゾーンを列挙し、対応するタイム ゾーン識別子を記録しておくことです。 この具体例については、「 How to: Enumerate time zones present on a computer」を参照してください。 「ローカル システムで定義されているタイム ゾーンの検索」記事には、選択したタイム ゾーン識別子の一覧も含まれています。

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

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

関連項目