反序列化 JSON 日期无时区

Posted

技术标签:

【中文标题】反序列化 JSON 日期无时区【英文标题】:Deserializing JSON dates timezone-less 【发布时间】:2012-10-30 18:27:58 【问题描述】:

从昨天开始我就有一个问题让我头疼,不知道如何处理。

我的数据库中有一个包含以下值的日期字段:

然后我的应用程序获取值并将其发送到我的网络表单。(值仍然相同 :) 很好!!

在客户端,我使用 javascript 警报中断以查看来自 JSON 的值(该值仍然相同 :) 很好!!

警报客户端的代码是这样的:

// transaction json model
var jsonTransaction = @(html.Raw(Json.Encode(this.Model.Transaction))); 
alert(new Date(parseInt(jsonTransaction.Date.substr(6))));
现在,当我将值发送回服务器时,这就是我得到的

最后在反序列化 JSON 之后,我的日期时间是错误的!!而不是第 7 天,现在是第 8 天??????

这是反序列化的代码:

public JsonResult SaveBill(string jsonTransaction, string jsonTranDetails)

    _appState = this.AppState;
    JsonResult returnVal = returnVal = Json(
       new  Success = true 
    );

var transaction = JsonConvert.DeserializeObject<BillTransaction>(jsonTransaction, new JsonSerializerSettings()  NullValueHandling = NullValueHandling.Ignore );

关于如何用日期解决这个问题的任何线索,我应该得到相同的日期,因为我没有改变任何东西。希望有人能指导我解决问题。

提前致谢。

【问题讨论】:

如果你使用 Newtonsoft 的 JSON.NET,这个问题就会消失。带有 ASP.NET MVC 4 的新 Web API 使用相同的解析器。 这应该讨论所有你需要知道的:hanselman.com/blog/… 获得相同日期的唯一方法是在服务器端执行此操作: JsonConvert.DeserializeObject(jsonTransaction, new JsonSerializerSettings() NullValueHandling = NullValueHandling.Ignore, DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, DateTimeZoneHandling = DateTimeZoneHandling.Local );但不知道使用 DateTimeZoneHandling.Local 是否可以?? 这取决于你的服务器端反序列化代码。作为字符串的 JSON 编码 - "Date(1341706634733)" - 正在被服务器端代码中的某些内容解释。该时间戳适用于您的正确日期。没有在 JSON 中编码日期的标准方法,因此这取决于 JsonConvert 代码的工作方式。 似乎解串器代码将时间戳解释为相对于您的本地时间而不是 UTC 时间戳。 我认为这是错误的:DateTimeZoneHandling = DateTimeZoneHandling.Local 但我不熟悉该软件。应该有一个选项可以将其设置为 UTC,所以我会尝试。 【参考方案1】:

Java 脚本在将日期解析为 currentdate = new Date(123232) 时使用通用时间 因此,当您向客户端发送日期时,请将其转换为 ISO 日期,例如 在将日期转换为 strong 之前,请确保日期为 UTC。

return String.Format("0:yyyy-MM-ddTHH:mm:ss.fffZ", dt); 

bty 我已经创建了 JSON Converted 以将任何日期序列化覆盖到客户端以使用上述功能。

【讨论】:

以上是关于反序列化 JSON 日期无时区的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime

如何使用客户端的时区将 asp.net 日期时间反序列化为 JSON 日期时间

为日期反序列化设置杰克逊时区

使用 JSON.NET 反序列化 DateTime 时如何保留时区? [复制]

反序列化日期保持本地时间

Spring boot - Jackson 日期序列化和反序列化