2013-07-15 7 views
10

Ich habe festgestellt, dass, wenn eine Datumseigenschaft vom Server mit dem Wert "2013-07-11T17: 11: 04.700" zurückkommt, der Wert in Thu Jul geändert wird 11 19:11:04 UTC + 0200 2013.breezejs: Datum ist nicht auf die richtige Zeit eingestellt

Beachten Sie die Zeit ist jetzt 2 Stunden voraus!

ich bereits über dieses Thema gekommen war, als Entitäten zu speichern, so dass ich meine Date Eigenschaften mit Hilfe momentjs explizit konvertieren:

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

Aber jetzt scheint es das Problem auch auftritt, wenn Leseoperationen zu tun.

Wie kann ich sicherstellen, dass die Werte meiner Datumseigenschaften nicht durch die Brise verändert werden?

Antwort

18

Breeze manipuliert die Datumsangaben nicht zum und vom Server in irgendeiner Weise EXCEPT, um einen UTZ-Zeitzonenspezifizierer zu jedem Datum hinzuzufügen, das vom Server zurückgegeben wird, die noch keinen haben. Dies geschieht nur deshalb, weil verschiedene Browser Datumsangaben ohne Zeitzonenbezeichner anders interpretieren und wir Konsistenz zwischen Browsern wünschen.

Die Ursache Ihrer Probleme ist wahrscheinlich, dass beim Speichern Ihrer Daten mit Datumsangaben in der Datenbank der von Ihnen verwendete Datentyp dateTime KEINEN Zeitzonenoffset enthält. Dies bedeutet, dass Sie den Offset wahrscheinlich "verlieren", wenn die Daten abgerufen werden und der oben erwähnte Breeze-Standard eintritt. Dies kann korrigiert werden, indem ein Datenbankdatumszeittyp mit einem Zeitzonenoffset (datetime2 oder datetimeoffset im SQLServer) verwendet wird.

Beachten Sie, dass Ihr Browser Datumsangaben entsprechend der aktuellen Zeitzone formatiert.

Ein weiterer Ansatz ist, dass Sie Breeze DataType.parseDateFromServer ersetzen kann nicht info jede Zeitzone zu schließen, wenn es nicht vorgesehen ist:

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

Dies kann jedoch in das Problem führen, dass verschiedene Browser Datetime Strings interpretieren, ohne eine Zeitzone versetzt anders ... So können Sie immer noch seltsame Ergebnisse abhängig vom Browser erhalten. In diesem Fall müssen Sie dem obigen Code einige Browser-Erkennungscodes hinzufügen.

Eine weitere Alternative besteht in der Verwendung der Bibliothek moment.js.

Nicht sicher, wie hilfreich das ist, aber hoffentlich ist das Verhalten von Breeze klarer.

+0

Überschreiben parseDateDromServer repariert es. Aber ich glaube, das Hinzufügen der Zeitzone Offset zur Datenbank wäre in der Tat eine bessere Lösung, obwohl es mehr Speicherplatz belegt :( Vielen Dank für die Antwort, das war hilfreich. – Sam

+3

Wo sollte ich die parseDateFromServer überschreiben? – newman

+0

Ich habe es versucht addieren alle Felder als datetime2 und die js Lösungen oben, aber der Kunde ist immer noch 1 Stunde vor dem auf dem Server gespeicherten Datum um 1 Stunde (wir sind UK DST hier) – johnstaveley

0

Standardmäßig bietet Breeze keine Möglichkeit, dies zu tun, aber Sie können den Code in Ihrer Modell-JS-Datei beibehalten, um dieses Problem zu beheben.

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; 
        } 
       } 
      }