2017-04-19 48 views
16

我試圖將一些數據發佈到具有日期的REST API中。 現在當我調試,我的日期參數是與我的時區正確日期JS Date對象:Tue Apr 04 2017 00:00:00 GMT+0530

後離開我的代碼,我看到網絡選項卡中的相同,則轉換爲UTC日期:"2017-04-03T18:30:00.000Z"

我搜索的解決方案,根據該我需要包括的角區域的文件在我的index.html,我做到了:

<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script> 

,但它並不能幫助。 我見過像添加日期格式的過濾器或其他解決方案,但我想要一個全局解決方案。 有什麼幫助嗎? 謝謝:)

+1

不清楚具體問題是什麼或者你想改變什麼 – charlietfl

+1

我在我的用戶界面上選擇4月4日,服務器在UTC時間4月3日。我的休息apis是第三方,不能改變它們。 我想要全局處理這個問題 – pranavjindal999

+1

但是當你將utc轉換回本地將是相同的。4月4日。仍然不清楚 – charlietfl

回答

2

金達爾薩博,它會這樣工作。當我們用日期選擇器選擇任何日期或只是傳遞任何值時,它將採用原始本地日期,但當我們將該值進一步傳遞給它時,它會將其轉換爲UTC,之後它需要在接收端再次轉換爲本地區域。數據庫以UTC格式保存日期時間。

3

與charlietfl建議的一樣,全局攻擊可能是重寫Date.prototype.toJSON()方法,但這不是一個好習慣。

你在哪裏使用$ http.post調用?提交$ http請求的最佳位置將在服務中。如果你使用服務,那麼我建議你包裝你的公共服務API,這樣你就可以擁有「公共」和「私人」方法:這些方法可以用於執行常見操作,如數據轉換,驗證等。

angular.service('bookStoreService', ['$http'], function($http) { 
    var normalizeBooks = function(booksArray){ 
     booksArray.forEach(function(book){ 
      // do something on the book 
     }); 
    }; 

    var updateBooks = function(books){ 
     normalizeBooks(books); 
     $http.post('myurl', books); 
    }; 

    return { 
     updateBooks : updateBooks 
    }; 
}); 
+1

這就是我不想做的事情。我只是希望在發佈時不要做這些轉換。 – pranavjindal999

+1

然後,$ http攔截器是您的解決方案 –

+0

請閱讀「轉換請求和響應」一節:https://docs.angularjs.org/api/ng/service/$http –

2

您是否已將angular-locale_en-in.js庫添加到您的應用程序中?事情是這樣的....

angular.module('myAngularApp', [ 
    'ngLocale']) 

否則,JS庫將不會在你的角度應用程序的任何影響。

+0

是的,我確實注入了相同的 – pranavjindal999

9

處理日期,時間和時區也讓我感到困惑。可能是這個答案給你一些關於你如何處理它們的見解。

嘗試在Chrome的開發者控制檯下面的代碼,看看日期同一如何以不同的格式呈現:

var date = new Date(); 
date.toISOString(); // "2017-04-29T09:54:28.714Z" 
date.toGMTString(); //"Sat, 29 Apr 2017 09:54:28 GMT" 
date.toLocalString(); //"4/29/2017, 3:24:28 PM" 

您在客戶端創建的任何日期總是記錄爲零時區,即UTC+/-00:00 Z偏移的日期。爲了簡單起見,您可能認爲UTC和GMT相同。當涉及到顯示目的時,根據瀏覽器的時區顯示同一日期。如果你做console.log (date)它會輸出Sat Apr 29 2017 15:24:28 GMT+0530 (IST)但這並不意味着日期的內部記錄是按照瀏覽器的時區。它只是按照瀏覽器的時區顯示在屏幕上/控制檯上。

查看日期表示不是從一個時區轉換到另一個時區,而是將它們視爲同一日期的不同表示。在您的瀏覽器中,它被表示爲GMT+0530偏移量,並且當它被髮送到服務器時,它是在零時區偏移量處的相同日期。

根據您的意見,如果您在GMT + 0530時區選擇4月4日00:00 AM,那麼在內部它將在GMT + 0,即零時區偏移量的4月3日18:30 PM。讓它按照原樣進入服務器。當你需要使用這個日期時,它將在4月3日從服務器返回,並且它將按照瀏覽器的時區偏移量顯示在瀏覽器中。不涉及轉換,它是具有不同表示的一個日期。

我曾問過一個related question,可能是這個增加了更多的說明。

總的來說,這個答案與@geminiousgoel和@charlietfl的答案相同。

3

場景:

發送日期從UIAPI callepoch time(UNIX時間),而不是date字符串。您可以使用getTime()方法將日期轉換爲紀元時間。

var dateStr = "Tue Apr 04 2017 00:00:00 GMT+0530"; 
 

 
var dateEpoch = new Date(dateStr).getTime(); 
 

 
console.log(dateEpoch); // 1491244200000 (Local Time)

在接收器端,他們有這個epoch time(UNIX時間)轉換成Date again.It將給予相同的本地日期\時間從UI通過。

樣品截圖 enter image description here

+0

謝謝爲你的答案,但沒有幫助。我無法控制API。 – pranavjindal999

+0

我在說,API團隊應該在他們的最後處理。 –

+0

是的,這就是我說的.. API團隊是第三方..我沒有控制API ..我不知何故需要一個全球性的解決方案,以便我選擇的日期是在服務器發送日期 – pranavjindal999

4

傳遞UTC日期到服務器所需的行爲。客戶端API應該處理UTC時間,而不是假定日期都是本地日期。

但無論如何,您可以根據當地時區將日期轉換爲字符串,並將該字符串傳遞給服務器。

+0

好主意@達達 – Anas

3

我想你可以將它作爲字符串(如果你使用接受字符串的API)以你需要的格式傳遞,比如說「2017年4月4日00:00:00 GMT + 0530」並將其保存在後臺,以字符串結尾,然後當您檢索它時,它將是字符串,因此不會以任何方式進行更改。

0

追加UTC末,使瀏覽器將其轉換爲UTC日期

var dateToServer =new Date(dateFromUser+" UTC"); 現在dateToServer將UTC DateTime格式。