読者です 読者をやめる 読者になる 読者になる

Ext JS 4 で Date を JSON 化するとタイムゾーン指定子がつかない

JavaScript REST ROA

Ext JS 4.1.1 では*1、Date を JSON 化する際に Ext.JSON.encodeDate() メソッドを使用していますが、
このメソッドはタイムゾーン指定子の無い日付文字列を生成してしまうので、サーバーアプリとの連携などで不都合が生じる可能性があります。

Ext.JSON.encodeDate() の実行結果例 (ChromeJavaScript コンソール)
> 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 の実行結果例 (ChromeJavaScript コンソール)
> 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""

*1:4.0.7 等も同様

*2:RESTEasy の Jackson Provider では UTC で処理されました

*3:ブラウザの種類やバージョンの違いで結果に差が生じるかもしれません