2012-12-18 131 views
0

我正在使用JsonValueProviderFactory从我的webapi返回JSON。当我发出ajax请求时,我返回JSON,并且我一直将日期的JSON表示转换为JavaScript日期对象:ASP.NET MVC 4 WebApi JsonValueProviderFactory JSON to JavaScript日期

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

data.StartDateTime JSON看起来像“2012-12-19T10:00:00”,它在我们对FireFox的测试中工作得非常好。当我测试对铬它处理的日期是不同的:

我测试的每个浏览器,新的日期(“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以避免这种情况。对问题有任何想法吗?

感谢您的帮助提前!

回答

0

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

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