Поделиться через


Практическое руководство. Разрешение проблемы неоднозначности времени

Неоднозначное время — это время, которое соответствует более чем одному значению времени в формате UTC. Это происходит, когда часы переводятся назад, как при переходе в одном часовом поясе с летнего времени на его стандартное время. При обработке неоднозначного времени, можно выполнить одно из следующих действий:

  • Сделать предположение о том, насколько время соответствует времени в формате UTC. Например, можно предположить, что неоднозначное время всегда выражается в стандартном времени часового пояса.

  • Если неоднозначное время является элементом данных, введенных пользователем, то можно предложить пользователю устранить неоднозначность.

В этом разделе показано, как устранить неоднозначное время, предполагая, что оно представляет собой стандартное время часового пояса.

Сопоставление неоднозначного времени стандартному времени часового пояса

  1. Вызовите метод IsAmbiguousTime, чтобы определить, является ли время неоднозначным.

  2. Если время является неоднозначным, вычитайте время из объекта TimeSpan, возвращаемого свойством часового пояса BaseUtcOffset.

  3. Вызовите метод static (Shared в Visual Basic .NET) SpecifyKind, чтобы задать значение даты и времени в формате UTC для свойства Kind равным DateTimeKind.Utc.

Пример

В следующем примере показано, как преобразовать неоднозначное время в формат UTC, предполагая, что оно представляет собой местное время часового пояса.

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

Пример состоит из метода с именем ResolveAmbiguousTime, который определяет является ли значение DateTime, переданное в него, неоднозначным. Если значение является неоднозначным, то метод возвращает значение DateTime, представляющее собой соответствующее время в формате UTC. Метод обрабатывает это преобразование путем вычитания значения свойства BaseUtcOffset местного часового пояса из локального времени.

Как правило, неоднозначное время обрабатывается вызовом метода TimeSpan для извлечения массива объектов GetAmbiguousTimeOffsets, содержащих возможные смещения неоднозначного времени относительно UTC. Однако в этом примере происходит произвольное предположение, что неоднозначное время следует всегда сопоставлять со стандартным временем часового пояса. Свойство BaseUtcOffset возвращает смещение между временем по UTC и временем стандартного часового пояса.

В этом примере все ссылки на местный часовой пояс выполняются через свойство TimeZoneInfo.Local; местный часовой пояс никогда не назначается в качестве переменной объекта. Это рекомендуется, поскольку вызов метода TimeZoneInfo.ClearCachedData внесет изменения во все объекты, которым назначен этот часовой пояс.

Компиляция кода

Для этого примера требуется:

  • Чтобы ссылка на System.Core.dll была добавлена в проект.

  • Чтобы пространство имен System было импортировано с помощью оператора using (обязательно в коде C#).

См. также

Задачи

Практическое руководство. Предоставление пользователям возможности разрешения неоднозначности времени

Другие ресурсы

Даты, время и часовые пояса