Практическое руководство. Разрешение проблемы неоднозначности времени
Неоднозначное время — это время, которое соответствует более чем одному значению времени в формате UTC. Это происходит, когда часы переводятся назад, как при переходе в одном часовом поясе с летнего времени на его стандартное время. При обработке неоднозначного времени можно выполнить одно из следующих действий:
Сделать предположение о том, насколько время соответствует времени в формате UTC. Например, можно предположить, что неоднозначное время всегда выражается в стандартном времени часового пояса.
Если неоднозначное время является элементом данных, введенных пользователем, то можно предложить пользователю устранить неоднозначность.
В этом разделе показано, как устранить неоднозначное время, предполагая, что он представляет стандартное время часового пояса.
Сопоставление неоднозначного времени стандартному времени часового пояса
IsAmbiguousTime Вызовите метод, чтобы определить, является ли время неоднозначным.
Если время неоднозначно, вычитает время из TimeSpan объекта, возвращаемого свойством часового пояса BaseUtcOffset .
static
Вызовите метод (Shared
в Visual Basic .NET), SpecifyKind чтобы задать для свойства DateTimeKind.Utcзначения даты и времени UTC значениеKind.
Пример
В следующем примере показано, как преобразовать неоднозначное время в формате 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
Пример состоит из метода с именем ResolveAmbiguousTime
, который определяет, является ли DateTime значение, переданное в него неоднозначным. Если значение неоднозначно, метод возвращает DateTime значение, представляющее соответствующее время в формате UTC. Метод обрабатывает это преобразование, вычитая значение свойства локального часового пояса BaseUtcOffset из локального времени.
Обычно неоднозначное время обрабатывается путем вызова GetAmbiguousTimeOffsets метода для получения массива TimeSpan объектов, содержащих возможные смещения времени UTC. Однако в этом примере происходит произвольное предположение, что неоднозначное время следует всегда сопоставлять со стандартным временем часового пояса. Свойство BaseUtcOffset возвращает смещение между utc и стандартным временем часового пояса.
В этом примере все ссылки на локальный часовой пояс выполняются через TimeZoneInfo.Local свойство. Локальный часовой пояс никогда не назначается переменной объекта. Это рекомендуемая практика, так как вызов TimeZoneInfo.ClearCachedData метода делает недействительными все объекты, которым назначен локальный часовой пояс.