1

モデルをデータベースに保存するために Backbone.js 同期を使用しています。

問題は、Backbone.js 同期が Date をローカル タイムゾーン形式から UTC Date に変換することです。JSON.stringifyBackbone.js 同期内での使用までさかのぼってこれを追跡しました。

params.data = JSON.stringify(model.toJSON());

ここで何が起こるかの例として:

>>> var a = {myDate: new Date();}
>>> JSON.stringify(a);
>>> a
"{"myDate":"2012-05-04T21:58:34.734Z"}"

そのため、Backbone.js 同期を再度使用して同じリソースを取得すると、タイムゾーンが UTC に変換されます。代わりに、元のローカル タイムゾーンを保持したいと思います。

私にとっては、データが UTC としてデータベースに保存されても問題ありませんが、どうにかしてデータをローカル タイムゾーンに戻すことができれば問題ありません。

すべてのヘルプが承認されます。

4

1 に答える 1

9

サーバーとのすべての通信は UTC で行う必要があるため、必要JSON.stringifyなことを行っています。不足している部分は、サーバーから取得した UTC タイムスタンプをブラウザーのローカル タイム ゾーンに変換しているようです。

parseモデルに実装を提供することで、モデルに入る前にサーバーの JSON をインターセプトできます。

解析する model.parse(response)

parseは、モデルのデータがサーバーによって返されるたびに、fetchおよびsaveで呼び出されます。この関数には生のオブジェクトが渡され、モデルに設定responseされる属性ハッシュを返す必要があります。デフォルトの実装はノーオペレーションであり、JSON レスポンスを通過するだけです。既存の API を使用する必要がある場合、または応答の名前空間を改善する必要がある場合は、これをオーバーライドします。

これでオブジェクトが取得{myDate: '2012-05-04T21:58:34.734Z'}されるresponseので、それをローカルタイムゾーンに変換するだけです。と を簡単に組み合わせるとDate.parsenew Dateブラウザのタイムゾーンで Date オブジェクトが得られます。

var d = new Date(Date.parse(response.myDate));
// Fri May 04 2012 14:58:34 GMT-0700 (PDT)

モデルに Date オブジェクトが必要な場合は、オブジェクトにラップされた Date を返すだけです。

return { myDate: d };

または、他にもできることがあればresponse:

response.myDate = d;
return response;
// or if you don't want to modify response
return _({}).extend(response, { myDate: d });

何らかの理由でブラウザのタイムゾーンに ISO-8601 文字列が必要な場合は、標準の Date メソッドを使用して簡単に作成できます。ただし、Date オブジェクトを保持した方がよいと思いますが、これは文字列よりもはるかに便利です。

于 2012-05-05T01:37:24.650 に答える