方法: あいまいな時刻を解決する

あいまいな時刻は複数の世界協定時刻 (UTC) にマップされる時刻です。 あいまいな時刻は、あるタイム ゾーンの夏時間から標準時間に移行する際など、時計の時刻を前に戻すときに発生します。 あいまいな時刻を処理する場合は、次のいずれかの操作を行います。

  • 時刻が UTC にどのようにマップされるかを想定します。 たとえば、あいまいな時刻は常にタイム ゾーンの標準時刻で表されると想定できます。

  • あいまいな時刻が、ユーザーによって入力されたデータ項目である場合は、あいまいさの解決をユーザーに任せることができます。

このトピックでは、タイム ゾーンの標準時刻を表すと想定して、あいまいな時刻を解決する方法を示します。

あいまいな時刻をタイム ゾーンの標準時刻にマップするには

  1. 時刻があいまいかどうかを確認するには、IsAmbiguousTime メソッドを呼び出します。

  2. 時刻があいまいな場合は、タイム ゾーンの BaseUtcOffset プロパティによって返される TimeSpan オブジェクトから時刻を減算します。

  3. static (Visual Basic .NET では Shared) SpecifyKind メソッドを呼び出して、UTC の日付と時刻の値の Kind プロパティを DateTimeKind.Utc に設定します。

次の例では、あいまいな時刻がローカル タイム ゾーンの標準時刻を表すと想定して、あいまいな時刻を UTC に変換する方法を示しています。

private static DateTime ResolveAmbiguousTime(DateTime ambiguousTime)
{
    // Time is not ambiguous
    if (!TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime))
    {
        return ambiguousTime;
    }
    // Time is ambiguous
    else
    {
        DateTime utcTime = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset,
                                                DateTimeKind.Utc);
        Console.WriteLine("{0} local time corresponds to {1} {2}.",
                          ambiguousTime, utcTime, utcTime.Kind.ToString());
        return utcTime;
    }
}
Private Function ResolveAmbiguousTime(ambiguousTime As Date) As Date
    ' Time is not ambiguous
    If Not TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime) Then
        Return TimeZoneInfo.ConvertTimeToUtc(ambiguousTime)
        ' Time is ambiguous
    Else
        Dim utcTime As Date = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset, DateTimeKind.Utc)
        Console.WriteLine("{0} local time corresponds to {1} {2}.", ambiguousTime, utcTime, utcTime.Kind.ToString())
        Return utcTime
    End If
End Function

この例は、渡された DateTime 値があいまいかどうかを判定する ResolveAmbiguousTime という名前のメソッドで構成されます。 値があいまいな場合、対応する UTC 時刻を表す DateTime 値がメソッドで返されます。 このメソッドでは、ローカル タイム ゾーンの BaseUtcOffset プロパティの値をローカル時刻から減算して、この変換を行います。

通常、あいまいな時刻の処理では、GetAmbiguousTimeOffsets メソッドを呼び出し、あいまいな時刻に対して考えられる UTC オフセットが格納されている TimeSpan オブジェクトの配列を取得します。 しかし、この例は、あいまいな時刻は常にタイム ゾーンの標準時刻にマップされるという想定に基づいています。 BaseUtcOffset プロパティでは、UTC とタイム ゾーンの標準時刻の間のオフセットが返されます。

この例では、ローカル タイム ゾーンへのすべての参照は TimeZoneInfo.Local プロパティによって行われます。ローカル タイム ゾーンが、オブジェクト変数に割り当てられることはありません。 ローカル タイム ゾーンが割り当てられているオブジェクトが TimeZoneInfo.ClearCachedData メソッドの呼び出しによって無効にされる可能性があるため、これがお勧めの方法です。

コードのコンパイル

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

  • using ステートメント (C# コードでは必須) を使用して System 名前空間がインポートされること。

関連項目