【问题标题】:Why is RavenDB storing my DateTime without UTC marker?为什么 RavenDB 在没有 UTC 标记的情况下存储我的 DateTime?
【发布时间】:2012-06-12 01:15:11
【问题描述】:

我有一个要保存到 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!

建议?

谢谢

【问题讨论】:

  • 我遇到了一个与服务器时区类似的问题。
  • 我假设您的“解决方案”是您不想公开谈论的讨厌的黑客行为?我知道我的是 (-;
  • 好的,我周末升级到了最新版本的 ASP.NET MVC/WebAPI (RC)。现在我可以将所有日期配置为与 UTC GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc; 进行序列化和反序列化,一切都很好!

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    注意最后的 Z。

    【讨论】:

    • 谢谢 Ayende - 我检查了你的建议,并修改了我的问题
    【解决方案3】:

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

    【讨论】:

    • 嗨-谢谢,是的,就Web API“生成”输出而言,我非常熟悉JSON日期问题,但我的问题与Web API如何接受传入日期有关。我已将序列化程序更改为使用 Newtonsoft 序列化程序,但是,正如您在公共代码中看到的那样,它不适用于 IKeyValueModel 类型,这是您在 HTTP POST 期间获得的。
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2020-02-25
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2015-10-08
    相关资源
    最近更新 更多