为什么RavenDB在没有UTC标记的情况下存储我的DateTime?

时间:2012-06-12 01:15:11

标签: datetime ravendb asp.net-web-api

我有一个C#对象,我将其保存到RavenRB(构建1.0.960),DateTime是UNIVERSAL - 但RavenDB将其存储为本地时间"Time": "2012-06-12T13:07:39.0000000"

然后,当我使用session.Query()。Where()...并传入一个通用时间时,我的对象不会被返回...因为比较它12小时(Im UTC + 1200)的重击

我做错了什么?

[编辑]

好的 - 我明白了问题所在。我正在将我的对象(JSON)发布到服务器,我以UTC格式发送它(没有时区偏移,“2012-06-12T13:07:39.00Z”) - 我天真地期待Asp.net Web API到将其反序列化为UTC种类的对象 - 就像它被发送一样 - 但不是。它是本地服务器时间的DESERIALIZED。这意味着当我将对象保存到Raven时,Raven将其存储为本地时间(没有Z标识符)。哎呀!我希望所有日期都以UTC格式存储在数据库中(按照最佳做法)!

试图破解Web API序列化是一件非常痛苦的事。 Raven可以通过一些魔法标志来保存我,它会在保存之前将所有日期转换为UTC吗? 我不想在保存之前对服务器上的对象,属性逐个属性,寻找DateTimes以及将它们转换为UTC进行反思...... EEEW!

建议?

由于

3 个答案:

答案 0 :(得分:3)

通过在ASP.NET MVC 4 RC中包含Json.net作为默认序列化程序,已解决此问题。 像这样配置:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.D‌​ateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; 

答案 1 :(得分:1)

亚当 检查Time.Kind属性,RavenDB应将UTC日期时间对象存储为:

"Time": "2012-06-12T13:07:39.0000000Z"

最后注意Z.

答案 2 :(得分:0)

斯科特汉塞尔曼详细阐述了JSON dates in ASP.NET Web Api的痛苦。看来他们希望在最终发布之前解决问题。与此同时,他指出了一种相对直接的方式来交换序列化器以使用JSON.NET here