我正在使用JsonValueProviderFactory从我的webapi返回JSON。当我发出ajax请求时,我得到了JSON,并且我已经将日期的JSON表示转换为JavaScript Date对象:
data.StartDateTime = new Date(data.StartDateTime);
data.StartDateTime JSON看起来像“2012-12-19T10:00:00”,它在我们针对FireFox的测试中运行良好。当我针对Chrome进行测试时,它会以不同的方式处理日期:
我测试了每个浏览器:新日期(“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日期,因为它们用于安排实体业务的约会,因此日期/时间必须保留在创建的时区中,如果有意义的话。 / p>
我编写了这个方法来获取附加到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以避免这种情况。对问题有任何想法吗?
提前感谢您的帮助!
答案 0 :(得分:0)
如果你继续这条路,你可能会发疯...特别是在软件维护期间。 由于服务器和客户端可能在不同的时区运行,因此最安全,最简单的方式是通过UTC时间进行通信。不要担心......浏览器以UTC格式收到的日期将在浏览器当地时间显示。 在Json中将日期发送到浏览器之前需要注意你不需要在UTC中进行转换,这项工作是由所有json格式化程序在RIGHT WAY中自动完成的....如果(并且仅当...)DateTime TimeKind属性设置为 Utc 或 Local ...如果此属性设置正确(即,如果其值不是未指定),则全部格式化程序会在将日期发送到Json之前将其标准化为UTC格式。所以在你的情况下,如果日期是以本地时间表示的,请确保所有DateTime都将其TimeKind设置为Local,然后再将它们传递给Json Formatter ......这就足够了。
我建议阅读我关于TimeZone相关问题的博客文章,该问题深入分析与时区相关的所有问题:Asp.net Mvc and the Nightmare of Dates and Time Zones