2014-11-06 21 views
2

這裏有一些片段的,我有工作在C#的設置:商店UTC日期在Visual Studio中設置文件

Settings.settings

<Setting Name="SomeSettingUtcDate" Type="System.DateTime" Scope="Application"> 
    <Value Profile="(Default)">10/27/2014 12:00:00</Value> 
</Setting> 

Settings.Designer.cs

[global::System.Configuration.ApplicationScopedSettingAttribute()] 
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 
[global::System.Configuration.DefaultSettingValueAttribute("11/6/2014 12:00:00")] 
public global::System.DateTime SomeSettingUtcDate { 
    get { 
     return ((global::System.DateTime)(this["SomeSettingUtcDate"])); 
    } 
} 

正如你可以看到的名字,我希望日期在UTC時間。在我的用例中,接受日期的方法將通過檢查DateTime.Kind屬性並確保它是DateTimeKind.Utc來檢查傳遞給它的日期是否爲 UTC。但是,致電Settings.Default.SomeSettingUtcDate返回的日期不會有此屬性集。

爲了滿足被調用方法中的檢查,創建一個新的DateTime對象與UTC類型集合似乎是一種破解,因爲大多數使用UTC日期的點都是這樣,所以每個人都會同意,實際發生,並促使人們思考時間,並第一次做對。如果我們從設置文件中獲取任何舊日期值,並假設它是UTC,那麼在我看來,我們可能不會檢查KindUtc,因爲它不必是那樣設置文件。

因爲我的方法可以用另一個日期(不是來自設置文件中的一個)調用,所以它仍然有檢查UTC類型的價值,所以我怎樣才能縮小這個差距,讓我和其他開發者更容易使用存儲在設置文件中的日期「陷入成功之坑」?

有沒有一種方法可以通過不同的日期時間對象來指定UTC(所以至少日期被假定爲UTC,並且在編輯設置時在GUI中可見地顯示這個指示符,例如它是例如UtcDateTime),還是在日期字符串本身中指定UTC?

回答

3

Kind未在設置文件中序列化,因此在反序列化時無法取回。最好的選擇可能是使用DateTimeOffset而不是DateTime; DateTimeOffset嵌入時區信息,該信息包含在其字符串表示中,因此如果序列化UTC日期,則在反序列化時將得到UTC日期。 (注意:DateTimeOffset沒有出現在設置設計器的類型下拉列表中,因此您必須從列表末尾的「Browse ...」條目手動選擇它;它位於mscorlib/System下)

+0

爲了用作DateTime,不需要將'DateTimeOffset'作爲偏移量應用於'DateTime'嗎? – ErikE 2014-11-06 22:56:21

+0

@ErikE,不,DateTimeOffset包含日期和時區。你可以像使用DateTime一樣使用它;它具有像Now和UtcNow這樣的屬性,並且可以將屬性轉換爲DateTime(LocalDateTime,UtcDateTime) – 2014-11-06 22:59:15

+0

我把它與TimeSpan混淆了。謝謝,這聽起來很完美*。 – ErikE 2014-11-06 23:18:26