我在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
我在这里做错了什么?我验证了存储在
中的值答案 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中的所有内容,然后在需要时转换为本地时间。这也是存储日期/时间的最佳做法。