2

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

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

我究竟做错了什么??

[编辑]

好的 - 我知道问题出在哪里。我正在将我的对象 (JSON) 发布到服务器,并以 UTC 格式发送它(无时区偏移,“2012-06-12T13:07:39.00Z”) - 我天真地期望 Asp.net Web API将其反序列化为 UTC Kind 的对象 - 就像它被发送一样 - 但不是。它被反序列化为本地服务器时间。这意味着当我将对象保存到 Raven 时,Raven 将其存储为本地时间(没有 Z 标识符)。啊!我希望我的所有日​​期都以 UTC 格式存储在数据库中(根据最佳实践)!

试图侵入 Web API 序列化是一件非常痛苦的事情。Raven 可以通过一些魔法标志来拯救我吗?它会在保存之前将所有日期转换为 UTC?在保存之前,我不想在服务器上逐个属性地反映我的对象,查找 DateTimes,并将它们转换为 UTC……EEEW!

建议?

谢谢

4

3 回答 3

3

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

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.D‌​ateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; 
于 2012-06-17T21:21:06.720 回答
1

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

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

注意最后的Z。

于 2012-06-12T06:37:39.683 回答
0

Scott Hanselman 详细阐述了ASP.NET Web Api 中 JSON 日期的痛苦。看来他们希望在最终发布之前纠正这个问题。同时,他指出了一种相对直接的方法,将序列化程序换成在此处使用 JSON.NET 。

于 2012-06-12T23:10:35.887 回答