簡體   English   中英

ASP.NET MVC 4 WebApi JsonValueProviderFactory JSON到JavaScript日期

[英]ASP.NET MVC 4 WebApi JsonValueProviderFactory JSON to JavaScript Date

我正在使用JsonValueProviderFactory從我的webapi返回JSON。 當我發出ajax請求時,我得到了JSON,並且我一直在將日期的JSON表示形式轉換為JavaScript Date對象:

data.StartDateTime =新日期(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以避免這種情況。 對問題有任何想法嗎?

謝謝您的幫助!

如果您繼續走這條路,您可能會發瘋……尤其是在軟件維護期間。 由於服務器和客戶端可能在不同的時區運行,因此使它們進行通信的最安全,最簡單的方法是通過UTC時間。 別擔心...瀏覽器以UTC格式接收的日期將顯示在瀏覽器本地時間。 在將日期發送到瀏覽器中的Json之前要特別注意,您不需要在UTC中進行轉換,此工作由正確的方式由所有json格式化程序自動完成。...如果(且僅當...時)DateTime TimeKind屬性設置為UtcLocal 。。。如果正確設置了此屬性(即,如果其值不是Unspecified ),則所有格式化程序在將其發送給Json之前都會以UTC格式對日期進行標准化。 因此,在您的情況下,如果在本地時間中加上日期,請確保在將所有DateTimes傳遞給Json Formatter之前,將所有DateTimes的TimeKind設置為Local。

我建議閱讀有關與TimeZone相關的問題的博客文章,以深入分析與時區有關的所有問題: Asp.net Mvc和日期和時區的噩夢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM