【问题标题】:Serializing dates to JSON seems to alter the date one hour back将日期序列化为 JSON 似乎会改变一小时前的日期
【发布时间】:2015-11-05 19:32:33
【问题描述】:

我试图了解为什么当我以 JSON 格式查看存储在我的 MSSQL 服务器中的日期时,它们会被改回一小时。

这是存储在 MSSQL 中的 Datetime 日期

2015-08-12 00:00:00.000

这是 Visual Studio 中的调试模式,显示日期“似乎”可以从数据库中正确检索。

{2015 年 8 月 12 日上午 12:00:00}

这是 JSON 输出 - 日期提前一小时!我看到 json 时区是-6,而数据库时区似乎没有,但我的 web api 配置中没有任何特殊设置。我真的不明白这里发生了什么。感谢任何帮助。

“2015-08-11T23:00:00-06:00”,

编辑:我的照片没有显示,所以我编辑了以文本格式显示日期 - 希望没关系。

【问题讨论】:

  • 向我们展示用于转换为 JSON 的代码。也可以直接查询数据库,验证调试器是否匹配。
  • @TimBiegeleisen 我没有任何直接序列化为 JSON 的代码,我猜它使用 ODATA 默认媒体格式化程序? MSSQL文本的第一个例子是使用SSMS直接选择的
  • UTC/本地时区 + DST 转换?
  • @MarvinSmit 我认为你是正确的,它在序列化过程中的某处添加了 DST。理想情况下,我更愿意存储为 UTC,并将日期作为 UTC 发出,而不发生任何转换。
  • OData V4 不支持 DateTime,仅支持 DateTimeOffset(根据定义包括 UTC 偏移信息)。 AFAIK OWin 将根据您线程的文化信息发出 DateTimeOffset。然后,您的解决方案将在于确保在“DateTime”和“DateTimeOffset”(分别为 DB/EF 和 OWin)之间转换时,您不依赖本地线程的语言环境设置,而是强制将其视为 UTC。

标签: sql-server json asp.net-web-api odata odata-v4


【解决方案1】:

当迁移到 OData V4(从早期版本)时,我们遇到的第一个“小问题”是 V4支持“DateTime”但“DateTimeOffset”。在 .Net 术语中,我们正在从“假定在运行它的服务器的区域设置时区中的日期”移动到明确包含时区信息本身的“DateTimeOffset”。

OWin 将根据线程的文化信息发出 DateTimeOffset。然后,您的解决方案将在于确保在“DateTime”和“DateTimeOffset”(分别为 DB/EF 和 OWin)之间进行转换时,您不依赖本地线程的语言环境设置,而是强制将其视为 UTC。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多