Практическое руководство. Разрешение проблемы неоднозначности времени
Неоднозначное время — это время, которое соответствует более чем одному значению времени в формате UTC. Это происходит, когда часы переводятся назад, как при переходе в одном часовом поясе с летнего времени на его стандартное время. При обработке неоднозначного времени, можно выполнить одно из следующих действий:
Сделать предположение о том, насколько время соответствует времени в формате UTC. Например, можно предположить, что неоднозначное время всегда выражается в стандартном времени часового пояса.
Если неоднозначное время является элементом данных, введенных пользователем, то можно предложить пользователю устранить неоднозначность.
В этом разделе показано, как устранить неоднозначное время, предполагая, что оно представляет собой стандартное время часового пояса.
Сопоставление неоднозначного времени стандартному времени часового пояса
Вызовите метод IsAmbiguousTime, чтобы определить, является ли время неоднозначным.
Если время является неоднозначным, вычитайте время из объекта TimeSpan, возвращаемого свойством часового пояса BaseUtcOffset.
Вызовите метод 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#).