天天看點

一起談.NET技術,System.DateTime 詳解(續)  一、你是否關注過DataColumn的DateTimeMode屬性  二、不同的DateTimeMode設定對DateTimeKind的影響  三、一個簡單的例子  四、DataSetDateTime.Unspecified V.S. DataSetDateTime.UnspecifiedLocal

DataSetDateTime.Local: 對于DateTimeKind.Local時間,不做任何轉換;對于DateTimeKind.Utc時間,基于時區偏移量進行轉換,并将Kind屬性轉換成DateTimeKind.Local;對于DateTimeKind.Unspecified,直接将Kind屬性轉換成DateTimeKind.Local,時間值(年、月、日、時、分、秒、毫秒等)保持不變;

DataSetDateTime.Utc: 對于DateTimeKind.Utc時間,不做任何轉換;對于DateTimeKind.Local時間,基于時區偏移量進行轉換,并将Kind屬性轉換成DateTimeKind.Utc;對于DateTimeKind.Unspecified,直接将Kind屬性轉換成DateTimeKind.Utc,時間值(年、月、日、時、分、秒、毫秒等)保持不變;

DataSetDateTime.Unspecified|UnspecifiedLocal:對于任何DateTimeKind類型的時間,直接将Kind屬性轉換成DateTimeKind.Unspecified,時間值(年、月、日、時、分、秒、毫秒等)保持不變。

一起談.NET技術,System.DateTime 詳解(續)  一、你是否關注過DataColumn的DateTimeMode屬性  二、不同的DateTimeMode設定對DateTimeKind的影響  三、一個簡單的例子  四、DataSetDateTime.Unspecified V.S. DataSetDateTime.UnspecifiedLocal

  然後,我寫了下面三個輔助的方法:CreateContact通過傳入的表示生日的DateTime建立一個ContractDataSet,DisplayBirthday分别将上訴四個字段的時間和Kind列印出來。

  我們的執行個體程式是這樣的:分别建立基于三種不同的DateTimeKind的DateTime對象,并據此建立三個ContractDataSet對象。最後調用DisplayBirthday方法将4個基于不同DateTimeMode的字段的時間和DateTimeKind列印出來。

  最終的輸出結果證明了我們上述的關于時間轉換規則的結論:

  到不前為止,我們貌似還看不到DataSetDateTime.Unspecified和DataSetDateTime.UnspecifiedLoca的差别。實際上,它們的差别展現在序列化上面:DataSetDateTime.UnspecifiedLoca在序列化的時候會保留基于目前時區的偏移量,而DataSetDateTime.Unspecified則不會。這個結論我也可以執行個體來證明,為此我寫了如下一段代碼對ContactDataSet進行序列化,并将序列化後的XML列印出來。

  從輸出的結果我們可以看出UnspecifiedBirthday和UnspecifiedLocalBirday之間的差别,後者有+8的偏移量,前者沒有。