在 C# 中反序列化 JSON 日期时出现问题 - 添加 2 小时
将 JSON 日期反序列化为 C# DateTime 时,我们遇到了一个棘手的问题。
代码为:
JavaScriptSerializer serializer = new JavaScriptSerializer();
jsonTrechos = jsonTrechos.Replace("/Date(", "\\/Date(").Replace(")/", ")\\/");
Trecho[] model = serializer.Deserialize<Trecho[]>(jsonTrechos);
jsonTrechos
是json2.js的JSON.stringify();
的字符串。
问题是:反序列化有效,但 Trechos 对象的所有日期都添加了 2 小时。
我的时区是巴西 (UTC -3),我们实行夏令时(所以我们目前使用 UTC -2),如果有什么关系的话。我想也许本地化和时区可能在这方面发挥了作用,如果确实如此,我不知道如何解决它。
We are having such a nasty problem when deserializating a JSON date to a C# DateTime.
The code is:
JavaScriptSerializer serializer = new JavaScriptSerializer();
jsonTrechos = jsonTrechos.Replace("/Date(", "\\/Date(").Replace(")/", ")\\/");
Trecho[] model = serializer.Deserialize<Trecho[]>(jsonTrechos);
The jsonTrechos
is a string of json2.js's JSON.stringify();
.
Problem is: the deserialization works, bur all dates of the Trechos objects are added with 2 hours.
My timezone is Brazil (UTC -3) and we're under daylight savings (so we're currently on UTC -2), if it has anything to do. I guess that perhaps localization and timezones may be playing a part on this and if they really are, I have no idea on how to fix it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
为 JSON 指定的日期是 UTC,正如您所提到的,您正在使用夏令时,因此 +2 小时是有意义的。理想情况下,无论如何,您都应该使用 UTC 日期时间,因为它消除了夏令时的麻烦(或者在本例中,它被添加到其中)并允许全球托管。
The dates specified for JSON are UTC, and as you've mentioned you're using daylight savings so +2 hours makes sense. Ideally you should be working with UTC date times anyway, as it removes the headaches of daylight savings (or in this case, it's added to it) and allows for global hosting.
“Javascript 日期是从 1970 年 1 月 1 日 00:00:00 世界标准时间 (UTC) 开始以毫秒为单位计算的,其中一天包含 86,400,000 毫秒”(摘自 W3schools)。所以你想将其转换为你当地的时区。
"Javascript dates are calculated in milliseconds from 01 January, 1970 00:00:00 Universal Time (UTC) with a day containing 86,400,000 milliseconds" (Excerpt from W3schools). So you want to convert it to your local timezone.
MSDN 中记录了这一点:
尝试调用
DateTime.ToLocalTime()
并查看是否获得正确的日期。This is documented in the MSDN:
Try calling
DateTime.ToLocalTime()
and see if you get the correct date for you.我强烈建议使用Json.NET 库。坦率地说,.NET 框架中的 JSON 序列化器(有多个)在某种程度上都很奇怪,尤其是在序列化日期时。
Json.NET 是我见过的唯一一个能够一致地处理它们(以及一般的 JSON)并且对其他使用者来说没有问题的库。
I would strongly recommend working with the Json.NET library. Quite frankly, the JSON serializers (and there are multiple ones) in the .NET framework are all quirky in some way, especially when it comes to serializing dates.
Json.NET is the only library that I've seen that handles them (and JSON in general) consistently and without problem for other consumers.