2013-07-15 47 views
10

我注意到,如果日期屬性從值「2013-07-11T17:11:04.700」從服務器回來,然後微風將值更改爲星期四七月11 19:11:04 UTC + 0200 2013.breezejs:日期未設置正確的時間

注意現在時間提前2小時!

保存實體時,我已經碰到過這樣的問題,所以我不得不使用momentjs顯式轉換我的日期屬性:

date.hours(date.hours() - moment().zone()/60); 

但現在在做讀操作時,似乎出現問題時也。

確保微風不會改變我的日期屬性值的最佳方式是什麼?

回答

18

微風不以任何方式操縱去往和來自服務器的日期時間除了向服務器返回的任何尚未有日期的地方添加UTZ時區說明符外。這只是因爲不同的瀏覽器在沒有時區說明符的情況下解釋日期,我們希望瀏覽器之間保持一致。

問題的根源很可能是當您使用日期將數據保存到數據庫時,您使用的dateTime數據類型不包含時區偏移量。這意味着當檢索到數據時,可能會「失去」偏移量,並且上面提到的Breeze默認值會啓用。這可以通過使用帶時區偏移量的數據庫日期時間數據類型(SQLServer中的datetime2或datetimeoffset)來更正。

請注意,您的瀏覽器根據當前時區格式化日期。

另一種方法是,你可以取代微風的DataType.parseDateFromServer到不能推斷任何時區信息,如果沒有提供它:

breeze.DataType.parseDateFromServer = function (source) { 
    return new Date(Date.parse(source)); 
}; 

但是,這可能碰到的問題,不同的瀏覽器解釋日期時間字符串無一個時區的偏移量不同......所以你依然可能得到奇怪的結果,這取決於瀏覽器。如果發生這種情況,您需要將一些瀏覽器檢測代碼添加到上面的代碼片段中。

另一種替代方法是使用moment.js庫執行以下操作。

breeze.DataType.parseDateFromServer = function (source) { 
    var date = moment(source); 
    return date.toDate(); 
}; 

不知道這是多麼有幫助,但希望Breeze的行爲更清晰。

+0

覆蓋parseDateDromServer確實解決了這個問題。但我相信增加時區偏移到數據庫將確實是一個更好的解決方案,雖然它佔用更多的存儲空間:( 感謝您的回覆,這是有幫助的。 – Sam

+3

我應該把parseDateFromServer覆蓋? – newman

+0

我試過了將所有字段添加爲datetime2和上面的js解決方案,但客戶端仍然比在服務器上保存的日期提前1小時1小時(我們在這裏是英國DST) – johnstaveley

0

默認情況下Breeze沒有提供任何方法來做到這一點,但你可以在你的模型js文件中保留下面的代碼來解決這個問題。

breeze.DataType.parseDateFromServer = function (source) { 
       if (typeof source === 'string') { 
        //Check for local offset time or UTC time from server 
        if (source.slice(-1) !== "Z") { 
         var oldSource = source; 

         try { 
          source = source.substring(0, source.lastIndexOf("-") - 1) 
          source = new Date(source); 
          var tzDifference = source.getTimezoneOffset(); 
          //convert the offset to milliseconds, add to targetTime, and make a new Date 
          var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000); 
          return offsetTime; 
         } 
         catch (err) { 
          source = new Date(source); 
          return source; 
         } 
        } 
        else { 
         source = new Date(source); 

         var tzDifference = source.getTimezoneOffset(); 
         //convert the offset to milliseconds, add to targetTime, and make a new Date 
         var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000); 

         return offsetTime; 
        } 
       } 
      }