0

我正在使用 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 以避免这种情况。对任何一种方式的问题有什么想法吗?

提前感谢您的帮助!

4

1 回答 1

0

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

我建议阅读我关于时区相关问题的博客文章,深入分析与时区相关的所有问题:Asp.net Mvc 和日期和时区的噩梦

于 2013-01-26T21:55:33.550 回答