2010-09-10 122 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全精度。