この記事の英語版を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

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

 

あいまいな時刻とは、複数の世界協定時刻 (UTC: Coordinated Universal Time) に対応する時刻です。 このようなことは、あるタイム ゾーンで夏時間から標準時間に移行する際など、クロック時刻を元に戻すときに発生します。 あいまいな時刻は、次のいずれかの方法で対処できます。

  • UTC に対する時刻の対応方法を想定します。 たとえば、あいまいな時刻は常にタイム ゾーンの標準時刻を表す、などと想定できます。

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

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

あいまいな時刻をタイム ゾーンの標準時刻に対応させるには

  1. IsAmbiguousTime メソッドを呼び出して、時刻があいまいかどうかを判定します。

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

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

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

private 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;            
   }   
}

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

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

この例では、ローカル タイム ゾーンに対するすべての参照は、TimeZoneInfo.Local プロパティを通して行います。ローカル タイム ゾーンをオブジェクト変数に割り当てることはしません。 TimeZoneInfo.ClearCachedData メソッドを呼び出すと、ローカル タイム ゾーンが割り当てられているオブジェクトは無効になるので、これが推奨される方法です。

コードのコンパイル

この例には、次の項目が必要です。

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

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

表示: