微風不以任何方式操縱去往和來自服務器的日期時間除了向服務器返回的任何尚未有日期的地方添加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的行爲更清晰。
覆蓋parseDateDromServer確實解決了這個問題。但我相信增加時區偏移到數據庫將確實是一個更好的解決方案,雖然它佔用更多的存儲空間:( 感謝您的回覆,這是有幫助的。 – Sam
我應該把parseDateFromServer覆蓋? – newman
我試過了將所有字段添加爲datetime2和上面的js解決方案,但客戶端仍然比在服務器上保存的日期提前1小時1小時(我們在這裏是英國DST) – johnstaveley