2010-09-10 165 views
1

我設置一個DateTime類型字段的日期,我叫這是使用位於同一臺服務器上我的web服務WCF:日期時間失去精度時,序列化/反序列化

// on the client   
myObject.Date = DateTime.Now; 
myChangedObject = proxy.DoNothing(myObject); // passes back the object 

// on the server 
public MyObjectType DoNothing(MyObjectType source) 
{ 
    var obj = new MyObjectType(); 
    obj.Date = source.Date; 

    return obj; 
} 

當它到達服務器DateTime精確到滴答,但我收到的對象有不同數量的滴答。

Assert.IsTrue(myChangedObject.Date == myObject.Date); // fails miserably 

我在這裏做錯了什麼?我驗證了存儲在

+1

你的代理如何對DateTime進行序列化? – Gabe 2010-09-10 02:12:55

+0

它使用WCF沒什麼不同。 – 2010-09-10 18:11:47

+0

雖然我的示例有點過於簡化。該對象被寫入數據庫然後回讀。數據庫列使用DateTime列類型。從我讀過的內容來看,這會導致精度的降低。我如何比較價值? – 2010-09-10 18:30:43

回答

1

也許你應該嘗試使用DateTime.UtcNow?

我不能說MS的實現,但我有通過WCF傳遞的DataSet的問題 - 所有DateTime列的DateTimeKind設置爲UnspecifiedLocal和Web服務(我猜)試圖是明智的,因此它將時間轉換爲UTC ...它也嘗試在客戶端逆轉進程(仍然停留在DateTimeKind.UnspecifiedLocal),但客戶端位於不同的TimeZone中,因此失敗了。

因此總結一下,他們可能已經將它轉換爲UTC ...所以最好的方法是實際傳遞UTC中的所有內容,然後在需要時轉換爲本地時間。這也是存儲日期/時間的最佳實踐。

2

中的值在SQL Server的Datetime類型中存儲DateTime將導致其丟失精度,因爲SQL Server僅以1/300秒爲增量存儲時間。我會用捨去一個功能比較秒,這樣才:

bool AreDateTimesEqual(DateTime a, DateTime b) 
{ 
    return a.AddMilliseconds(-a.Millisecond) 
     == b.AddMilliseconds(-b.Millisecond); 
} 

或者,如果你有超過架構和SQL Server 2008的控制,切換到Datetime2,其中有DateTime全精度。