方法: あいまいな時刻を解決することができますHow to: Let users resolve ambiguous times

あいまいな時刻とは、複数の世界協定時刻 (UTC) にマップされる時刻です。An ambiguous time is a time that maps to more than one Coordinated Universal Time (UTC). これは、あるタイム ゾーンの夏時間から標準時間に移行する際など、時計の時刻を前に戻すときに発生します。It occurs when the clock time is adjusted back in time, such as during the transition from a time zone's daylight saving time to its standard time. あいまいな時刻を処理する場合は、次のいずれかの操作を行います。When handling an ambiguous time, you can do one of the following:

  • あいまいな時刻が、ユーザーによって入力されたデータの項目の場合は、あいまいさの解決をユーザーに任せることができます。If the ambiguous time is an item of data entered by the user, you can leave it to the user to resolve the ambiguity.

  • 時刻が UTC にどのようにマップされるかを想定します。Make an assumption about how the time maps to UTC. たとえば、あいまいな時刻は常にタイム ゾーンの標準時刻で表されると想定できます。For example, you can assume that an ambiguous time is always expressed in the time zone's standard time.

このトピックでは、あいまいな時刻を解決するには、ユーザーを許可する方法を示します。This topic shows how to let a user resolve an ambiguous time.

ユーザーにあいまいな時刻を解決させるにはTo let a user resolve an ambiguous time

  1. ユーザーによって入力された日付と時刻を取得します。Get the date and time input by the user.

  2. 呼び出す、IsAmbiguousTime時刻があいまいかどうかを調べます。Call the IsAmbiguousTime method to determine whether the time is ambiguous.

  3. 時刻があいまいな場合は、呼び出し、GetAmbiguousTimeOffsetsの配列を取得する方法をTimeSpanオブジェクト。If the time is ambiguous, call the GetAmbiguousTimeOffsets method to retrieve an array of TimeSpan objects. 配列内の各要素には、あいまいな時刻にマップできる UTC オフセットが含まれています。Each element in the array contains a UTC offset that the ambiguous time can map to.

  4. ユーザーに目的のオフセットを選択させます。Let the user select the desired offset.

  5. ローカル時刻からユーザーによって選択されたオフセットを減算して、UTC の日時を取得します。Get the UTC date and time by subtracting the offset selected by the user from the local time.

  6. 呼び出す、 static (Shared Visual Basic .NET で)SpecifyKind値を設定する (utc) 日付と時刻のメソッドKindプロパティをDateTimeKind.Utcです。Call the static (Shared in Visual Basic .NET) SpecifyKind method to set the UTC date and time value's Kind property to DateTimeKind.Utc.

Example

次の例では、ユーザーに日付と時刻を入力するように求め、それがあいまいである場合は、ユーザーにあいまいな時刻をマップする UTC 時刻を選択させています。The following example prompts the user to enter a date and time and, if it is ambiguous, lets the user select the UTC time that the ambiguous time maps to.

private void GetUserDateInput()
{
   // Get date and time from user
   DateTime inputDate = GetUserDateTime();
   DateTime utcDate;
   
   // Exit if date has no significant value
   if (inputDate == DateTime.MinValue) return;
   
   if (TimeZoneInfo.Local.IsAmbiguousTime(inputDate))
   {
      Console.WriteLine("The date you've entered is ambiguous.");
      Console.WriteLine("Please select the correct offset from Universal Coordinated Time:");
      TimeSpan[] offsets = TimeZoneInfo.Local.GetAmbiguousTimeOffsets(inputDate);
      for (int ctr = 0; ctr < offsets.Length; ctr++)
      {
         Console.WriteLine("{0}.) {1} hours, {2} minutes", ctr, offsets[ctr].Hours, offsets[ctr].Minutes);
      }
      Console.Write("> ");
      int selection = Convert.ToInt32(Console.ReadLine());
      
      // Convert local time to UTC, and set Kind property to DateTimeKind.Utc
      utcDate = DateTime.SpecifyKind(inputDate - offsets[selection], DateTimeKind.Utc);

      Console.WriteLine("{0} local time corresponds to {1} {2}.", inputDate, utcDate, utcDate.Kind.ToString());
   }
   else
   {
      utcDate = inputDate.ToUniversalTime();
      Console.WriteLine("{0} local time corresponds to {1} {2}.", inputDate, utcDate, utcDate.Kind.ToString());    
   }
}

private DateTime GetUserDateTime() 
{
   bool exitFlag = false;             // flag to exit loop if date is valid
   string dateString;  
   DateTime inputDate = DateTime.MinValue;
        
   Console.Write("Enter a local date and time: ");
   while (! exitFlag)
   {
      dateString = Console.ReadLine();
      if (dateString.ToUpper() == "E")
         exitFlag = true;
         
      if (DateTime.TryParse(dateString, out inputDate))
         exitFlag = true;
      else
         Console.Write("Enter a valid date and time, or enter 'e' to exit: ");
   }

   return inputDate;        
}
Private Sub GetUserDateInput()
   ' Get date and time from user
   Dim inputDate As Date = GetUserDateTime()
   Dim utcDate As Date
   
   ' Exit if date has no significant value
   If inputDate = Date.MinValue Then Exit Sub
   
   If TimeZoneInfo.Local.IsAmbiguousTime(inputDate) Then
      Console.WriteLine("The date you've entered is ambiguous.")
      Console.WriteLine("Please select the correct offset from Universal Coordinated Time:")
      Dim offsets() As TimeSpan = TimeZoneInfo.Local.GetAmbiguousTimeOffsets(inputDate)
      For ctr As Integer = 0 to offsets.Length - 1
         Dim zoneDescription As String
         If offsets(ctr).Equals(TimeZoneInfo.Local.BaseUtcOffset) Then 
            zoneDescription = TimeZoneInfo.Local.StandardName
         Else
            zoneDescription = TimeZoneInfo.Local.DaylightName
         End If
         Console.WriteLine("{0}.) {1} hours, {2} minutes ({3})", _
                           ctr, offsets(ctr).Hours, offsets(ctr).Minutes, zoneDescription)
      Next         
      Console.Write("> ")
      Dim selection As Integer = CInt(Console.ReadLine())
      
      ' Convert local time to UTC, and set Kind property to DateTimeKind.Utc
      utcDate = Date.SpecifyKind(inputDate - offsets(selection), DateTimeKind.Utc)

      Console.WriteLine("{0} local time corresponds to {1} {2}.", inputDate, utcDate, utcDate.Kind.ToString())
   Else
      utcDate = inputDate.ToUniversalTime()
      Console.WriteLine("{0} local time corresponds to {1} {2}.", inputDate, utcDate, utcDate.Kind.ToString())    
   End If
End Sub

Private Function GetUserDateTime() As Date
   Dim exitFlag As Boolean = False            ' flag to exit loop if date is valid
   Dim dateString As String 
   Dim inputDate As Date = Date.MinValue
        
   Console.Write("Enter a local date and time: ")
   Do While Not exitFlag
      dateString = Console.ReadLine()
      If dateString.ToUpper = "E" Then exitFlag = True
      If Date.TryParse(dateString, inputDate) Then
         exitFlag = true
      Else   
         Console.Write("Enter a valid date and time, or enter 'e' to exit: ")
      End If
   Loop

   Return inputDate        
End Function

コード例の中核を成すの配列を使用してTimeSpanあいまいな時刻 (utc) からの可能なオフセットを示すオブジェクト。The core of the example code uses an array of TimeSpan objects to indicate possible offsets of the ambiguous time from UTC. ただし、これらのオフセットは、ユーザーにとって意味がない可能性があります。However, these offsets are unlikely to be meaningful to the user. オフセットの意味を明確にするには、コードで、オフセットがローカル タイム ゾーンの標準時刻を表すか、または夏時間を表すかに注意します。To clarify the meaning of the offsets, the code also notes whether an offset represents the local time zone's standard time or its daylight saving time. コードを決定する時間は標準的などの時間が夏時間の値とオフセットを比較することによって、BaseUtcOffsetプロパティです。The code determines which time is standard and which time is daylight by comparing the offset with the value of the BaseUtcOffset property. このプロパティは、UTC とタイム ゾーンの標準時間の差を示します。This property indicates the difference between the UTC and the time zone's standard time.

この例では、ローカル タイム ゾーンへのすべての参照はを通じて行われます、TimeZoneInfo.Localプロパティ以外のローカル時刻ゾーンをオブジェクト変数に割り当てることはありません。In this example, all references to the local time zone are made through the TimeZoneInfo.Local property; the local time zone is never assigned to an object variable. これは、ためにの推奨される方法への呼び出し、TimeZoneInfo.ClearCachedDataメソッドには、ローカル タイム ゾーンに割り当てられているすべてのオブジェクトが無効にします。This is a recommended practice because a call to the TimeZoneInfo.ClearCachedData method invalidates any objects that the local time zone is assigned to.

コードのコンパイルCompiling the code

この例で必要な要素は次のとおりです。This example requires:

  • される System.Core.dll への参照をプロジェクトに追加します。That a reference to System.Core.dll be added to the project.

  • Systemと共に名前空間をインポートする、usingステートメント (c# コードで必要です)。That the System namespace be imported with the using statement (required in C# code).

関連項目See also

日付、時刻、およびタイム ゾーン する方法: あいまいな時刻を解決するにはDates, times, and time zones How to: Resolve ambiguous times