日付をUnixタイムスタンプとして渡すのが好きで、コンテキストに応じてさまざまな形式を使用して日付を表示する必要があったため、これと同じ問題が発生しました。これが私がそれをした方法です。
ストアを介してデータをロードする場合は、Ext.data.Fieldが提供する変換関数を使用できます。例えば:
var fields = [
{name: 'sysTestedDateObj', mapping: 'sysTestedDateTS', type: 'date', dateFormat: 'timestamp'},
/** Converted Fields **/
{name: 'sysTestedDate', convert: function(v, rec){
return fmtDate('sysTestedDateTS', rec);
}},
{name: 'targetChangeStartDate', convert: function(v, rec){
return fmtDate('targetChangeStartDateTS', rec);
}},
{name: 'createDateTime', convert: function(v, rec){
return fmtDateTime('createDateTS', rec);
}},
{name: 'modifyDateTime', convert: function(v, rec){
return fmtDateTime('modifyDateTS', rec);
}},
];
var store = new Ext.data.JsonStore({
...
fields: fields
});
いくつかの変換関数は次のとおりです。
function fmtDate(sf, rec) {
if ( rec[sf] ) {
var dt = new Date(); dt.setTime(rec[sf] * 1000); return dt.format('l j F Y');
}
};
function fmtDateShort(sf, rec) {
if ( rec[sf] ) {
var dt = new Date(); dt.setTime(rec[sf] * 1000); return dt.format('D j M Y');
}
};
function fmtDateTime(sf, rec) {
if ( rec[sf] ) {
var dt = new Date(); dt.setTime(rec[sf] * 1000); return dt.format('l j F Y h:i a');
}
};
function fmtDateTimeShort(sf, rec) {
if ( rec[sf] ) {
var dt = new Date(); dt.setTime(rec[sf] * 1000); return dt.format('D j M Y h:i a');
}
};
ここで、sfは、フォーマットされた日付文字列を取得するソースフィールドです。
次のことに注意してください、それは重要です。convert()関数は、リーダーによって読み取られたデータレコードのコピーとともに提示されます(これはExtJSドキュメントにあります)。これは、変換でマップされたフィールドを使用できないことを意味します。上記のfields配列には、次のように定義されたフィールドがあります。
{name: 'sysTestedDateObj', mapping: 'sysTestedDateTS', type: 'date', dateFormat: 'timestamp'}
したがって、sysTestedDateTSフィールドからsysTestedDateObj日付オブジェクトを作成しており、Unixタイムスタンプを含むオブジェクトから派生した日付オブジェクトを取得するように読者に指示しました。これは後で使用するのに適したオブジェクトですが、変換関数に渡されるデータレコードの一部にはなりません。
また、変換関数は、ストアで使用するために定義されていないレコード内のフィールドを参照できることに注意してください。上記の例では、サーバーがJSON応答でフィールドsysTestedDateTSを提供していることがわかっているため、変換関数でフィールドsysTestedDateTSを使用していますが、fields配列で定義していないため、ストアを介してコンポーネントを消費します。