【发布时间】: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