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

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

.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 プロパティに対応します。 タイム ゾーン識別子は、タイム ゾーンを一意に識別するキー フィールドです。 ほとんどのキーは比較的短くなりますが、タイム ゾーン識別子は比較的長くなります。 ほとんどの場合、その値は、タイム ゾーンの標準時刻の名前を指定するために使用されるStandardName オブジェクトのTimeZoneInfo プロパティに対応します。 ただし、例外もあります。 有効な識別子を指定する最善の方法は、システムで使用可能なタイム ゾーンを列挙し、それらに存在するタイム ゾーンの識別子をメモすることです。 図については、「 方法: コンピューターに存在するタイム ゾーンを列挙する」を参照してくださいローカル システムで定義されているタイム ゾーンの検索に関する記事には、選択したタイム ゾーン識別子の一覧も含まれています。

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

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

こちらも参照ください