【问题标题】:ASP.NET MVC 4 WebApi JsonValueProviderFactory JSON to JavaScript DateASP.NET MVC 4 WebApi JsonValueProviderFactory JSON 到 JavaScript 日期
【发布时间】:2012-12-18 18:47:03
【问题描述】:

我正在使用 JsonValueProviderFactory 从我的 webapi 返回 JSON。当我发出 ajax 请求时,我得到了 JSON,并且我一直在将日期的 JSON 表示形式转换为 JavaScript Date 对象:

data.StartDateTime = new Date(data.StartDateTime);

data.StartDateTime JSON 看起来像“2012-12-19T10:00:00”,它在我们针对 FireFox 的测试中运行良好。当我对 Chrome 进行测试时,它会以不同的方式处理日期:

我测试了每个浏览器:new Date("2012-12-19T10:00:00")

FF: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
IE: Date {Wed Dec 19 2012 03:00:00 GMT-0700 (Mountain Standard Time)}
Chrome: Date {Wed Dec 19 2012 03:00:00 GMT-0700 (Mountain Standard Time)}
Safari: Invalid Date

所以,webkit 似乎想要包含时区。我可以计算用户时区偏移并将其附加到 JSON 日期值,这会产生:

新日期("2012-12-19T10:00:00-07:00")

FF: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
IE: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
Chrome: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}
Safari: Date {Wed Dec 19 2012 10:00:00 GMT-0700 (Mountain Standard Time)}

因此,根据这些发现,我似乎只需要将时区偏移量附加到 JSON 日期表示,然后就可以了。请记住,这些日期/时间不是 UTC 日期,因为它们用于安排实体业务的约会,因此如果有意义的话,日期/时间必须保持在它创建的时区中。

我编写了这个方法来获取附加到 JSON 日期值的偏移量:

_calculateTimezoneOffset: function() {
            var offset = new Date().getTimezoneOffset(),
                hour = parseInt(offset / 60, 10),
                minutes = offset % 60,
                prefix = '-';

            if (offset > 0) {
                prefix = '-';
            } else {
                prefix = '+';
                hour *= -1;
            }

            if (hour < 10) {
                hour = prefix + '0' + hour;
            } else {
                hour = prefix + hour;
            }

            if (minutes < 0) {
                minutes *= -1;
            }   

            if (minutes < 10) {
                minutes = '00';
            }

            return hour + ':' + minutes;
        }

有没有更好的方法来处理这个问题?在重新考虑这一切之后,我可能会开始将日期转换为 UTC 以避免这种情况。对这两种方式有什么想法吗?

提前感谢您的帮助!

【问题讨论】:

    标签: javascript json asp.net-mvc-4


    【解决方案1】:

    如果您继续走这条路,您可能会发疯……尤其是在软件维护期间。 由于服务器和客户端可能在不同的时区运行,因此最安全、最简单的通信方式是通过 UTC 时间。不用担心...浏览器收到的 UTC 格式的日期将显示在浏览器本地时间中。 在将日期发送到 Json 中的浏览器之前请注意,您不需要将其转换为 UTC,此工作由所有 json 格式化程序以正确的方式自动完成......如果(并且仅当......) DateTime TimeKind 属性设置为 UtcLocal...如果此属性设置正确(即,如果其值不是 Unspecified)所有格式化程序将在将日期发送到 Json 之前以 UTC 格式标准化日期。因此,在您的情况下,如果日期以本地时间表示,请确保所有 DateTime 在将它们传递给 Json 格式化程序之前将其 TimeKind 设置为 Local ...这就足够了。

    我建议阅读我关于时区相关问题的博文,深入分析与时区相关的所有问题:Asp.net Mvc and the Nightmare of Dates and Time Zones

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      相关资源
      最近更新 更多