DateTime在序列化/反序列化时失去精度

时间:2010-09-10 01:58:04

标签: .net datetime

我在DateTime类型字段上设置日期,并使用WCF调用位于同一服务器上的Web服务:

// 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

我在这里做错了什么?我验证了存储在

中的值

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

也许您应该尝试使用DateTime.UtcNow?

我不能代表MS的实现,但是我遇到了通过WCF传递的DataSet的问题 - 所有DateTime列都将DateTimeKind设置为UnspecifiedLocal而Web服务(我猜)试图明智,因此它将时间转换为UTC ...它还尝试在客户端转换进程(仍然停留在DateTimeKind.UnspecifiedLocal),但客户端位于不同的TimeZone中,因此它失败了。

总而言之,他们可能已将其转换为UTC ...所以最好的方法是实际传递UTC中的所有内容,然后在需要时转换为本地时间。这也是存储日期/时间的最佳做法。