在 C# 中反序列化 JSON 日期时出现问题 - 添加 2 小时

发布于 2024-10-05 04:15:25 字数 525 浏览 6 评论 0原文

将 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 技术交流群。

扫码二维码加入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.

醉殇 2024-10-12 04:15:26

“Javascript 日期是从 1970 年 1 月 1 日 00:00:00 世界标准时间 (UTC) 开始以毫秒为单位计算的,其中一天包含 86,400,000 毫秒”(摘自 W3schools)。所以你想将其转换为你当地的时区。

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)

"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.

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)
献世佛 2024-10-12 04:15:25

MSDN 中记录了这一点:

日期对象,以 JSON 表示为
“/日期(刻度数)/”。这
刻度数是正数或
负长值表示
滴答数(毫秒)
自午夜 01 起已过去
世界标准时间 1970 年 1 月。

尝试调用 DateTime.ToLocalTime() 并查看是否获得正确的日期。

This is documented in the MSDN:

Date object, represented in JSON as
"/Date(number of ticks)/". The
number of ticks is a positive or
negative long value that indicates the
number of ticks (milliseconds) that
have elapsed since midnight 01
January, 1970 UTC.

Try calling DateTime.ToLocalTime() and see if you get the correct date for you.

烂柯人 2024-10-12 04:15:25

强烈建议使用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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文