【发布时间】: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