如何使用預設為 DateTimeKind.Utc 的 DateTime 值進行 DataSet.Fill?
我有一個應用程序,它可以從 SQL 讀取數據並通過 WCF 將其發送到客戶端應用程序,其方式類似於:
SqlDataAdapter da = new SqlDataAdapter( cmd ) DataSet ds = new DataSet(); da.Fill( ds ); return ds;所有日期/時間都以 UTC 格式儲存在數據庫中。我注意到,如果執行應用程序的電腦上的時鐘出現偏差,客戶收到的日期/時間也會出現偏差。似乎如果 DateTime 類型是未指定的類型,WCF 將在內部將其表示為本地時間,並按原樣發送,因此應用程序和客戶端之間的任何時間差異都會導致日期/時間發生變化。
我當然可以在檢索數據集並修復日期/時間欄位時遍歷它們,但是這裡有人會想一些更好的方法來填充數據集,以便每個 DateTime 欄位都會自動成為 da.Fill() 上的 DateTimeKind.Utc?
如果您使用的是 SQL Server 2008,那麼“正確”的解決方案是使用 SQL
datetimeoffset數據類型而不是 SQL 的日期時間。datetimeoffset是 SQL 2008 新的時區感知日期/時間類型,將在 ADO.NET 中轉換System.DateTimeOffset為始終相對於 UTC 的 CLR 類型。這是一篇部落格文章,其中詳細介紹了這一點。MSDN 上的前幾個搜尋結果DateTimeOffset提供了額外的背景資訊。如果您無法更改 SQL 架構,ADO.NET 有一個針對這種情況定制的屬性:
DataColumn.DateTimeMode,它控制在數據集序列化時是否添加本地時區(DateTimeMode=DataSetDateTime.UnspecifiedLocal預設為 ),或者是否不添加時區資訊關於序列化 (DateTimeMode=DataSetDateTime.Unspecified)。你想要後者。如果我對 MSDN 文件的閱讀是正確的,您應該能夠在填充 DataSet 後
DateTimeMode=DataSetDateTime.Unspecified為有問題的問題進行設置。DataColumn這應該序列化沒有時區的列。如果您想要真正正確(或者如果上述方法不起作用),您可以
DataTable提前創建並設置該列的DateTimeMode=DataSetDateTime.UtcbeforeFill-ing 它與行。這樣您就可以確保以 UTC 格式發送日期。