2015-11-11 68 views
8

我需要從靜態調用DateTime.UtcNow調用一個時間提供服務,返回,基本上DateTimeOffset.UtcNow升級部分的代碼。對此DateTimeOffset實例進一步轉化爲DateTime,有DateTime財產。或者,似乎存在從DateTimeOffsetDateTime的隱式轉換。是否等於DateTime.UtcNow的DateTimeOffset.UtcNow.DateTime?

我有點擔心,可能會有一些邊緣的情況下,我不能現在看到的地方這兩個不會是等價的。在那兒?

+1

」爲了進一步將此DateTimeOffset實例轉換爲DateTime,有DateTime屬性「 - 還有'UtcDateTime'屬性,它似乎更適合您的場景 – Joe

回答

4

內部,它看起來是這樣的:

public static DateTimeOffset UtcNow { 
     get { 
      return new DateTimeOffset(DateTime.UtcNow); 
     } 
    } 

    public DateTime DateTime { 
     get { 
      return ClockDateTime; 
     } 
    } 
    private DateTime ClockDateTime { 
     get { 
      return new DateTime((m_dateTime + Offset).Ticks, DateTimeKind.Unspecified); 
     } 
    } 

    public DateTime UtcDateTime { 
     [Pure] 
     get { 
      Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Utc); 
      return DateTime.SpecifyKind(m_dateTime, DateTimeKind.Utc); 
     } 
    } 

所以看起來你可能最終得到的是基於UTC,但隨後被轉換爲Unspecified日期時間。

+0

在這種情況下,對結果應調用'DateTime.SpecifyKind'足以使其與'DateTime.UtcNow'完全相同,對吧? – hvd

+0

看起來是正確的,但是不會使它成爲第三個創建DateTime對象嗎? UTCNow,ClockDateTime,然後最終調整種類。如果OP很樂意轉換,那麼可以確定。如果一些現有的代碼依賴於它們是100%等效的,那麼可能存在問題。 – MattC

+0

我可以在'DateTimeOffset'實例上使用'.UtcDateTime'而不是'.DateTime'屬性嗎?像這樣:'DateTimeOffset.UtcNow.UtcDateTime' –

2

the .NET reference source

public static DateTimeOffset UtcNow { 
    get { 
     return new DateTimeOffset(DateTime.UtcNow); 
    } 
} 

所以,是的,它看起來像它相當於DateTime.UtcNow

+0

它似乎稍後會進一步損壞,所以我認爲你是對的,他們可能具有相同的值,但不確定'DateTimeKind'設置。 – MattC

3

如果你看看DateTimeOffset.UtcNow.DateTime.Kind的價值,你會看到它是不確定的。框架將未指定的種類視爲當地時間。 DateTime.UtcNow的種類是Utc,所以當時區轉換應用於本地時區和從本地時區應用時,會有差異。

的解決辦法是使用具有一種指定的UTC的DateTimeOffset.UtcNow.UtcDateTime。 「