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

Posted

技术标签:

【中文标题】反序列化日期保持本地时间【英文标题】:Deserilize date keeping local time 【发布时间】:2017-09-16 21:44:02 【问题描述】:

Json 日期很难,转换似乎在逃避我。它似乎丢失了转换中的时间部分。

我从 API 返回以下 Json Microsoft 日期。我知道并且可以确认日期是 2017 年 5 月 5 日早上 7 点

但是,当使用 newtonsoft 反序列化日期时,我可以让它保留时区信息。我已经尝试了所有各种设置,但无法解决这个问题。

我的反序列化代码如下所示

var settings = new JsonSerializerSettings 
     DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
     DateParseHandling = DateParseHandling.DateTimeOffset,
     DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
;

items = JsonConvert.DeserializeObject<List<UpcomingMeetingListDto>>(
                    responseContent, settings);

当然,这一定很容易,我只是可以理解它。我想一定是因为json中的日期格式没有关联的TZ信息。也许我需要一个自定义日期反序列化器来处理这种情况或设置文化。

我正在使用 Newtonsoft.Json 版本 9.0.1

【问题讨论】:

1493704800000 是格林威治标准时间 2017 年 5 月 2 日。您使用的是哪个时区? 【参考方案1】:

DateTime 已正确反序列化,但它是 GMT 格式。要显示本地时间,您应该使用 ToLocalTime() 方法。

例如,通过向您的 UpcomingMeetingListDto 添加一个属性。

public DateTime LocalMeetingDate => MeetingDate.ToLocalTime();

试试这个online epoch converter,它会显示本地时间和格林威治标准时间。

【讨论】:

谢谢 想疯了 错误地假设是早上 7 点 真正有趣的是在我序列化它是早上 7 点之前在数据库中。认为序列化正在发挥作用:) 使用 mvc 5,2 JsonResult。给了我一些东西来看看 感谢您帮助我解决这个问题并给我发送了一个更好的在线时代工具。我最终使用 SpecifyKind ` 序列化到 UTC

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

JSON如何反序列化日期时间并将UTC转换为指定时区?

C#从xml反序列化日期时间

Jackson 使用自定义日期格式错误地反序列化 Joda 日期

将json的日期属性反序列化为LocalDate

反序列化客户端 AJAX JSON 日期

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