Share via


如何:解决不明确的时间

不明确的时间是指映射到多个协调世界时 (UTC) 的时间。 当向回调整时钟时间时(例如某时区在从夏时制转换为标准时间的过程中),就会出现此情况。 在处理不明确的时间时,可执行下列操作之一:

  • 就时间映射到 UTC 的方式进行假设。 例如,可以假定某个不明确的时间始终表示为时区的标准时间。

  • 如果该不明确的时间是用户输入的数据项,则可将这种多义性留给用户解决。

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

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

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

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

  3. 调用 static(在 Visual Basic .NET 中为 Shared)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 值是否为不明确的。 如果该值是不明确的,该方法将返回一个表示相应 UTC 时间的 DateTime 值。 该方法通过从本地时间中减去本地时区的 BaseUtcOffset 属性值来处理此转换。

通常,处理不明确的时间的方法是调用 GetAmbiguousTimeOffsets 方法以检索 TimeSpan 对象的数组,这些对象包含不明确时间的各种可能的 UTC 偏移量。 但是,此示例进行了主观假设:不明确的时间应始终映射到时区的标准时间。 BaseUtcOffset 属性返回 UTC 和时区标准时间之间的偏移量。

在此示例中,本地时区都通过 TimeZoneInfo.Local 属性来引用,而从未分配给对象变量。 这是一种建议做法,因为调用 TimeZoneInfo.ClearCachedData 方法会使分配了本地时区的任何对象都失效。

编译代码

此示例需要:

  • 在项目中添加一个对 System.Core.dll 的引用。

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

请参见

任务

如何:让用户解决不明确的时间

其他资源

日期、时间和时区