Ext JS 4 で Date を JSON 化するとタイムゾーン指定子がつかない
Ext JS 4.1.1 では*1、Date を JSON 化する際に Ext.JSON.encodeDate() メソッドを使用していますが、
このメソッドはタイムゾーン指定子の無い日付文字列を生成してしまうので、サーバーアプリとの連携などで不都合が生じる可能性があります。
Ext.JSON.encodeDate() の実行結果例 (Chrome の JavaScript コンソール)
> var d = new Date() > d Fri Aug 10 2012 00:05:58 GMT+0900 (東京 (標準時)) > Ext.JSON.encodeDate(d) ""2012-08-10T00:05:58""
この "2012-08-10T00:05:58" を UTC として処理してしまうと *2、日本時間的には 8/10 の 09:05:58 として扱われてしまい、本来の時間 (日本時間で 00:05:58) とズレる事になります。
回避策
この問題を回避するには、ExtJS アプリケーションの実行時に Ext.JSON.encodeDate() をオーバーライドしてしまうのが簡単だと思います。
具体的には、launch 処理で Ext.JSON.encodeDate を JSON.stringify() を使ったものに置き換えます。*3
app.js (Ext.JSON.encodeDate のオーバーライド例)
Ext.application({ ・・・ launch: function() { Ext.JSON.encodeDate = function(o) { return JSON.stringify(o); }; ・・・ } });
オーバーライドした Ext.JSON.encodeDate の実行結果例 (Chrome の JavaScript コンソール)
> var d = new Date() > d Fri Aug 10 2012 00:05:58 GMT+0900 (東京 (標準時)) > Ext.JSON.encodeDate = function(o) {return JSON.stringify(o);} > Ext.JSON.encodeDate(d) ""2012-08-09T15:05:58.513Z""