作法:解決模稜兩可的時間

不明確的時間是指對應到多個國際標準時間 (UTC) 的時間。 發生時機是往回調整時鐘時間,例如從時區的日光節約時間轉換到其標準時間期間。 處理不明確的時間時,您可以執行下列其中一項:

  • 假設如何將時間對應至 UTC。 例如,您可以假設不明確的時間一律是以時區的標準時間表示。

  • 如果不明確的時間是使用者所輸入的資料項目,可交由使用者解決此不明確狀況。

本文示範在假設不明確時間代表該時區標準時間的情況下,如何解決不明確時間的問題。

將不明確的時間對應至時區標準時間

  1. 呼叫 IsAmbiguousTime 方法來判斷時間是否不明確。

  2. 如果是不明確時間,會減去時區 BaseUtcOffset 屬性所傳回 TimeSpan 物件的時間。

  3. 呼叫 static (Visual Basic .NET 中的 Shared) SpecifyKind 方法,以將 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 值是否不明確。 如果是不明確的值,則方法會傳回 DateTime 值,代表對應的 UTC 時間。 此方法處理這項轉換的方式是將當地時間減去當地時區 BaseUtcOffset 屬性值。

一般而言,不明確時間的處理方式是呼叫 GetAmbiguousTimeOffsets 方法來擷取 TimeSpan 物件陣列,其中包含不明確時間可能的 UTC 時差。 不過,此範例會進行任意假設,即不明確的時間應該一律對應至時區標準時間。 BaseUtcOffset 屬性會傳回 UTC 與時區標準時間之間的時差。

在此範例中,當地時區的所有參考都是透過 TimeZoneInfo.Local 屬性進行;當地時區絕不會指派給物件變數。 這是建議作法,原因是對 TimeZoneInfo.ClearCachedData 方法的呼叫會讓任何指派給當地時區的物件失效。

編譯程式碼

這個範例需要:

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

另請參閱