2012-12-18 52 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