2015-05-10 103 views
0

我正面臨以下問題,我有一個使用angular和java的應用程序。客戶端在一個頁面中選擇某個日期和時間,例如2015-04-03 15:00這個數據被放在JavaScript對象中作爲日期,然後這個數據被提交給我的服務器,但它接收服務器將該日期/時間轉換爲他的時區節省2015-04-03 16:00而不是15:00作爲客戶端發送。服務器端更改客戶端發送的日期/時間

後,我提交數據時,我重新加載頁面顯示爲1小時少

將數據發送到服務器的日期,其中被持久化到數據庫服務器。注意有一個console.info()可以打印日期時間。它正在打印正確的日期/時間。用戶選擇的日期/時間。

$scope.confirmCallback = function() { 
       $scope.schedule.client = $scope.client; 
       $scope.schedule.type = 'CONTACT'; 
       console.info($scope.schedule.date); //PRINTS OK DATE/TIME 
       ScheduleRepository.create($scope.schedule).then(function() { 
        Alert.success('views.schedule.message.successSaved'); 
        $scope.schedule = {}; 
        $scope.tableSchedules.reload(); 
       }, function() { 

       }); 
      } 

這是在我的服務器端接收請求的控制器上。如果我檢查json,請求到達服務器的那一刻,我可以看到日期時間值與我發送的日期時間值不同。我猜是在客戶端和服務器端與時區相關的東西。

@Dynamic("CREATE_SCHEDULE, EDIT_SCHEDULE") 
public static Result save() { 
    try { 
     JsonNode request = request().body().asJson();//SHOWS DIFFERENT DATE/TIME 
     ScheduleClient scheduleClient = JSONUtils.fromJson(request, ScheduleClient.class); 

任何建議如何解決這個問題?在此先感謝

+0

不清楚發送給服務器的是什麼,日期或字符串表示。這會有所作爲。還有什麼證據表明發球會改變它。 – redge

+0

問題不明。請提供一些代碼。 – squill25

+0

@Ignaus是發送到服務器的日期。一個Java腳本對象的日期與上面提到的值。當服務器得到日期以某種方式改變發送的日期。我還增加了關於這個問題的更多信息。 – vinyoliver

回答

0

幾件事情來實現:

  • 一個Date對象無法跨網發送。它必須是序列號
  • JSON沒有本地日期序列化格式,但最佳實踐慣例是發送ISO-8601/RFC3339序列化字符串。
  • JS Date對象會佔用它運行的時區。因此,如果您撥打toISOString(或者如果您的ScheduleRepository確實),它將使用該時區轉換爲UTC。
  • 在接收端,您的JSONUtils.fromJson調用將將字符串值反序列化爲您的ScheduleClient類使用的任何對象結構。
  • 如果該對象也具有本地時間行爲,它將使用服務器的本地時區

因此,您要麼通過比較本地值與UTC值,要麼通過比較本地時間值與另一個時區的本地時間來看到時差。

因爲您沒有顯示代碼的重要部分,所以很難給出更確切的建議。我們需要查看Date對象的初始分配,序列化代碼,通過線路發送的字符串值,反序列化代碼以及正被反序列化的類結構。我們還需要一些上下文來了解您的用戶是否在特定的通用時刻或特定的本地時區日期和時間或者日曆日期或什麼時間選擇日期和時間。上下文是關鍵,你沒有提供太多的東西繼續下去。

+0

感謝您的幫助。我必須像你說的那樣做一些事情。我將日期作爲字符串發送並在服務器端轉換爲日期。這樣我就不再有時區問題了。 – vinyoliver

相關問題