【发布时间】:2015-10-19 21:50:16
【问题描述】:
我在 C# 中使用 Json.net 7.0.1 来使用休息 API。问题在于 API 在其 JSON 响应中使用的日期格式。它看起来像这样:
/Date(1445301615000-0700)/
这意味着表示 2015-10-19 17:40:15 的 UTC 时间
如果您将 1445301615000 插入 epoch time converter,您会看到它是 2015-10-20 00:40:15 。所以比 UTC 早 7 小时。然后它们包括 -0700 大概是为了将其抵消回 UTC。因此,为了给我一个 UTC 时间,他们向我发送了 UTC+7-0700。他们为什么这样做我不知道,但我无法改变。
我的问题是,如何最好地让 Json.NET 解析该日期字符串并得出 2015-10-19 17:40:15 UTC 的 DateTime。我可以编写一个自定义的 JsonConverter 来劫持值并手动操作它,但我想知道是否有更原生的方法。
我尝试将JsonSerializerSettings DateTimeZoneHandling 属性更改为所有不同的值。将其设置为 Utc 只是忽略时区偏移,产生2015-10-20 00:40:15。将其设置为 Local、Unspecified 或 RoundtripKind all yield 2015-10-19 20:40:15,我认为这是因为我的本地时区是 UTC-4,所以它试图将该调整应用于 2015-10-20 00:40 的主要日期值.
我还考虑使用DateFormatString 属性来表示预期的日期字符串格式。但是我找不到合适的format string characters 来表示这种纪元时间偏移格式。
这是一个简化的例子:
Person person;
string json = @"{ 'Name': 'John',
'LastSeen':'/Date(1445301615000-0700)/' }"; // 1445301615000 = 2015-10-20 00:40:15
person = JsonConvert.DeserializeObject<Person>(json);
Console.WriteLine(person.LastSeen); // 10/19/2015 8:40:15 PM Kind = Local
person = JsonConvert.DeserializeObject<Person>(json, new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat });
Console.WriteLine(person.LastSeen); // 10/19/2015 8:40:15 PM Kind = Local
person = JsonConvert.DeserializeObject<Person>(json, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc });
Console.WriteLine(person.LastSeen); // 10/20/2015 00:40:15 PM Kind = Utc
// In all three, the -0700 portion is being ignored. I'd like person.LastSeen to be 10/19/2015 17:40:15.
再次,我可以知道 API 将给我 UTC+7 并自己进行调整以获得真正的 UTC。但我想知道 Json.NET 是否有本地方式来处理这种类型的日期字符串。
【问题讨论】:
-
我确实有,还有很多相关的文档。我发现很多关于解析像 Date(1445301615000) 这样的普通“Microsoft 格式”日期字符串的内容,但对于添加了 -0700 偏移量的这种特殊格式却一无所知。
标签: c# .net datetime timezone json.net