共用方式為


HOW TO:解決模稜兩可的時間

更新:2007 年 11 月

模稜兩可的時間就是可以對應至一個以上 Coordinated Universal Time (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 值是否模稜兩可。如果值模稜兩可,方法會傳回 DateTime 值,代表對應的 UTC 時間。這個方法是將當地時區的 BaseUtcOffset 屬性值,從當地時間中減去以進行轉換。

一般而言,呼叫 GetAmbiguousTimeOffsets 方法以擷取 TimeSpan 物件的陣列 (內含模稜兩可的時間可能的 UTC 位移),就可以解決模稜兩可的時間但是,這個範例會自行假設,模稜兩可的時間應該要永遠對應至時區的標準時間。BaseUtcOffset 屬性會傳回 UTC 與時區的標準時間之間的位移。

在本範例中,當地時區的所有參考都是透過 TimeZoneInfo.Local 屬性所建立的,當地時區並沒有被指派給物件的變數。建議採取這個方法,因為呼叫 TimeZoneInfo.ClearCachedData 方法會使被指派當地時區的任何物件失效。

編譯程式碼

這個範例需要:

  • 將 System.Core.dll 的參考加入至專案中。

  • 以 using 陳述式 (C# 程式碼中的必要項) 匯入 System 命名空間。

請參閱

工作

HOW TO:讓使用者解決模稜兩可的時間

其他資源

時間和時區