Ext JS: отображение дат в UTC независимо от часового пояса браузера

#javascript #extjs #extjs5

#javascript #extjs #extjs5

Вопрос:

Каков наилучший способ принудительно отображать даты в UTC (и игнорировать местное время браузера) в сетке Ext JS?

Моя модель получает даты в UTC:

 "2014-06-24T00:00:00 00:00"
  

В моей сетке есть столбец datecolumn:

 Ext.define('MyApp.view.MyGrid', {
    store: MyApp.store.MyStore,
    columns: [
        {
            xtype: 'datecolumn',
            text: 'Date',
            dataIndex: 'date',
            format: 'Y-m-d H:i:sO'
        },
    ]
});
  

Даты отображаются в браузере по местному времени, например:

 2014-06-24 01:00:00 0100
  

Но я хочу отображать их в UTC.

На данный момент лучшим решением, которое я нашел, является импорт moment.js и использовать его таким образом:

 {
    xtype: 'datecolumn',
    text: 'Date',
    dataIndex: 'date',
    renderer: function (value) {
        return moment.utc(value).format('YYYY-MM-DD HH:mm:ssZZ');
    }
}
  

Что дает желаемый результат:

 2014-06-24 00:00:00 0000
  

Наверняка есть более чистый способ?

Ответ №1:

Я не вижу встроенной поддержки UTC, поэтому вы можете, например, расширить ее datecolumn и использовать moment для отображения даты. Пример:

 Ext.define('Ext.grid.column.UtcDate', {
    extend: 'Ext.grid.column.Date',
    alias: ['widget.utcdatecolumn'],
    alternateClassName: 'Ext.grid.UtcDateColumn',

    defaultRenderer: function(value){
        return moment.utc(value).format(this.format);
    }
});
  

Тогда просто используйте utcdatecolumn вместо datecolumn :

 Ext.define('MyApp.view.MyGrid', {
    store: MyApp.store.MyStore,
    columns: [
        {
            xtype: 'utcdatecolumn',
            text: 'Date',
            dataIndex: 'date',
            format: 'YYYY-MM-DD HH:mm:ssZZ'
        }
    ]
});
  

Ответ №2:

Это есть в последней версии EXTJS. Используйте toUTCstring() или другие доступные методы toUTC xxxx().

в качестве альтернативы, можно сделать следующее:

 // convert to msec
// add local time zone offset 
// get UTC time in msec

utc = d.getTime()   (d.getTimezoneOffset() * 60000);