Share via


如何:解析明确时间

不明确时间是指映射到多个协调世界时 (UTC) 的时间。 在向后调整时钟时间时,例如从时区的夏令时调整到标准时间这段转换期间,便会出现不明确时间。 在处理不明确时间时,可执行以下任一操作:

  • 假设一下时间如何映射到 UTC。 例如,可以假定不明确时间始终以时区的标准时间表示。

  • 如果不明确时间是用户输入的数据项,则可以让用户自行解决。

本主题介绍如何通过假定不明确时间表示时区的标准时间,来解析不明确时间。

将不明确时间映射到时区的标准时间

  1. 调用 IsAmbiguousTime 方法来确定时间是否不明确。

  2. 如果时间不明确,请从时区的 BaseUtcOffset 属性返回的 TimeSpan 对象减去该时间。

  3. 调用 static(Visual Basic 中的 SharedSpecifyKind 方法,将 UTC 日期和时间值的 Kind 属性设置为 DateTimeKind.Utc

示例

以下示例阐述如何通过假定不明确时间表示本地时区的标准时间,将不明确的时间转换为 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 值是否不明确。 如果值不明确,则该方法会返回一个表示相应 UTC 时间的 DateTime 值。 该方法通过从本地时间减去本地时区的 BaseUtcOffset 属性的值,来处理此转换。

通常,通过调用 GetAmbiguousTimeOffsets 方法检索一组 TimeSpan 对象(其中包含不明确时间与 UTC 可能的时差),来处理不明确时间。 但是,本示例建立在一个大胆假设之上,即不明确时间始终映射到时区的标准时间。 BaseUtcOffset 属性返回 UTC 与时区的标准时间之间的时差。

在本示例中,均通过 TimeZoneInfo.Local 属性引用本地时区;绝不会将本地时区分配给对象变量。 这是建议做法,因为调用 TimeZoneInfo.ClearCachedData 方法会使本地时区分配到的任何对象无效。

编译代码

此示例需要:

  • 使用 using 语句导入的 System 命名空间(在 C# 代码中是必需的)。

另请参阅