2013-07-15 17 views
10

日付プロパティが "2013-07-11T17:11:04.700"という値のサーバーから戻ってきた場合、breezeはその値をThu Julに変更します11 19:11:04 UTC + 0200 2013.breezejs:日付が適切な時刻に設定されていない

時刻は2時間先です。

エンティティを保存するとき、私はすでにこの問題に遭遇していたので、私は明示的にmomentjsを使用して、私の日付のプロパティを変換する必要がありました:

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

しかし、今では読む操作を行う際に問題が発生したようです。

breezeが自分の日付プロパティの値を変更しないようにするにはどうすればよいですか?

答えて

18

Breeze は、サーバーとの間でやりとりする日付時刻を操作しません。サーバーから返された日付にUTZタイムゾーン指定子を追加することを除いて、例外はありません。これは、異なるブラウザがタイムゾーン指定子を使用せずに日付を解釈するため、ブラウザ間で整合性が必要な場合にのみ実行されます。

日付のあるデータをデータベースに保存すると、使用しているdateTimeデータ型にタイムゾーンオフセットが含まれていない可能性があります。これは、データが取得されるとオフセットが失われる可能性が高く、上記のBreezeのデフォルトが起動することを意味します。これは、データベースの日付時刻のデータ型をタイムゾーンオフセット(SQLServerのdatetime2またはdatetimeoffset)と組み合わせて使用​​することで修正できます。

ブラウザは、現在のタイムゾーンに従って日付をフォーマットしています。

別のアプローチは、それが提供されていない場合は、任意のタイムゾーン情報を推測しないようにブリーズのDataType.parseDateFromServerを置き換えることができるということです。

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

しかし、これは、異なるブラウザはなしDateTimeの文字列を解釈するという問題に遭遇することができますタイムゾーンが異なるようにオフセットされています...あなたはまだブラウザによっては奇妙な結果が得られるかもしれません。その場合は、上記のスニペットにブラウザ検出コードを追加する必要があります。

もう1つの方法は、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時間遅れています(ここでは英国夏時間です)。 – 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; 
        } 
       } 
      } 
関連する問題