2016-02-09 2 views
0

Ищете некоторую помощь относительно того, как мое поле даты отображается через мой графический интерфейс.ExtJS/Javascript - поле даты преобразуется неправильно через GUI

Вопросы:

  1. Я выбираю поле даты с помощью календаря - если я выбираю 2016-02-07 и сохранить его в базе данных, почему графический интерфейс отображает дату в GMT (2016 -02-06)

  2. Для полей start_time и end_time, почему они сохраняются в моей базе данных с «2008-01-01T»?

Некоторые справочная информация:

Тип базы данных: PostgreSQL

ExtJS: 5.0.1

База данных хранит значения, как:

дата = 2016-02 -07

start_t IME = 2008-01-01T05: 00: 00

END_TIME = 2008-01-1T07: 00: 00

графический интерфейс отображает значения, как: даты

= 2016-02-06 (похоже, что он преобразовывает значение в БД GMT)

start_time = 5:00

END_TIME = 7:00 утра

Хранение:

Store.model.Base.defineModel(
'Ticket', 
[{name: 'attributes_id', type: 'int'}, 
{name: 'number', type: 'string'}, 
{name: 'date', type: 'date'}, 
{name: 'start_time', type: 'date', dateWriteFormat: 'g:i A'}, 
{name: 'end_time', type: 'date', dateWriteFormat: 'g:i A'} 
], 
true 

);

Вид:

   xtype: 'fieldset', 
       title: 'Details', 
       layout: { type: 'hbox', align: 'stretch' }, 
       items: [{ 
        xtype: 'container', 
        layout: 'vbox', 
        style: { paddingRight: '10px' }, 
        items: [{ 
        xtype: 'textfield', 
        labelAlign: 'top', 
        fieldLabel: 'Number', 
        id: 'Number', 
        name: 'number', 
        width: 250 
        }, 
        { 
        xtype: 'datefield', 
        labelAlign: 'top', 
        fieldLabel: 'Date', 
        format: 'Y-m-d', 
        submitFormat: 'c', 
        id: 'Date', 
        name: 'date', 
        width: 250 
        }, 
      { 
        xtype: 'timefield', 
        labelAlign: 'top', 
        fieldLabel: 'Start Time', 
        id: 'StartTime', 
        name: 'start_time', 
        minValue: '12:00 AM', 
        maxValue: '11:00 PM', 
        format: 'g:i A', 
        increment: 60, 
         width: 250 
        }, 
      { 
        xtype: 'timefield', 
        labelAlign: 'top', 
        fieldLabel: 'End Time', 
        id: 'EndTime', 
        name: 'end_time', 
        minValue: '12:00 AM', 
        maxValue: '11:00 PM', 
        format: 'g:i A', 
        increment: 60, 
         width: 250 
        }] 
       },] 

Сохранить:

_constructSaveStore: function(config) { 
    var me = this; 
    var store = config.store; 

    this._tasks.push({fn: function() { 
     if(store.getModifiedRecords().length > 0 || 
      store.getRemovedRecords().length > 0) 
     { 
      store.sync({callback: function(records, operation, success) { 
         me.setStatus(success); 

         if(!operation.wasSuccessful()) { 
          var message = "Failed to save changes on server."; 

          if(operation.hasException()) 
           message = message + " " + operation.getError(); 

          var app = CarrierDMZ.getApplication(); 
          app.toast(message,'error'); 
         }       
        } 
       }); 
     } 
     else { 
      me.setStatus(true); 
     } 
    }}); 
} 

Форма Определение:

  region: 'center', 
      xtype: 'form', 
      id: 'TicketForm', 
      autoScroll: true, 
      bodyPadding: 10, 
      layout: { 
       type: 'vbox', 
       align: 'stretch' 
      } 

Спасибо!

+0

Самый важный код отсутствует. Пожалуйста, покажите, как вы отправляете свои данные на сервер. Используете ли вы 'store.sync',' model.save' или 'form.submit'? И как ваша форма определена? – Alexander

+0

Я использую функцию store.sync - я добавил его и определение формы в код выше. – Jukebox

ответ

1

Чтение/дата записи значения из/на сервер

Существует множество вариантов, как читать значения даты/записи с/на сервер.

Проблема в том, что стандарт JSON не имеет специального типа данных для дат.Даты могут передаваться как строки, ints или объекты в различных форматах, или даже в (преднамеренное) нарушение стандарта JSON («путь Microsoft»).

Дата сама по себе представляет собой сложный объект, являющийся как целым числом секунд с определенного времени, так и значением, которое сообщает вам, в каком часовом поясе вы находитесь. Зоны времени сами по себе являются сложными объектами, их 104 известный только операционной системе Windows. Now go figure what happens when different bodies try to build a standard вокруг этот хаос.

Когда вы используете form.submit(), форма заполнит все значения полей даты. AFAIK нет никакого способа, как выстроить их в определенном порядке; ExtJS всегда будет создавать строку по умолчанию. Это зависит от бэкэнда, может ли он понять эту строку по умолчанию, потому что, как я уже упоминал, нет стандарта.

Когда вы используете model.save() или store.sync(), подход отличается. Форма передаст модели дату JavaScript, когда вы скажете form.updateRecord(); и если поле модели имеет значение type:date, оно будет хранить дату javascript. При форматировании даты отправки поле использует конфигурацию dateWriteFormat или dateFormat, которая впоследствии соблюдается во время обоих save() и sync(). Во время этого преобразования ExtJS обрабатывает часовые пояса только в некоторых случаях, в зависимости от формата.

При звонке store.load или model.load, то же самое происходит в другом направлении. Но вместо dateWriteFormat, метод чтения использует dateReadFormat. Преобразование полностью обратимо, если вы используете одинаковые значения для обоих. Но

  • при чтении "2016-01-01" с помощью dateFormat:'Y-m-d', дата 2016-01-01 : 00: 00 GMT + 01: 00 на моем компьютере.
  • при чтении «2016-01-01» с использованием dateFormat:'c', дата 2016-01-01 : 00: 00 GMT + 01: 00 на моем компьютере.

Если смешать оба формата, который является то, что вы делаете (используя g:i A как dateWriteFormat и по умолчанию c как dateReadFormat), все идет наперекосяк.

Таким образом, рекомендуемый способ, чтобы не использовать форму загрузки/представить, и в пользу dateFormat над dateWriteFormat и dateReadFormat. Если вы всегда указываете совместимые форматы (Y-m-d H:i или c, не оба), а также правильное преобразование на стороне сервера, вы будете в безопасности. Also note that sencha has hidden a very strong suggestion to that regard somewhere in the docs.

Время Поля

Время поля выбора времени, но значения даты JavaScript также нужна дата. Так ExtJS изобрел следующую инициализацию, которые вы можете переопределить для определенных полей времени, если вы хотите:

initDate: '1/1/2008', 
initDateParts: [2008, 0, 1], 
initDateFormat: 'j/n/Y', 

Убедитесь, что оба initDate и initDateParts синхронизированы, либо ад может сломаться потерять. Но большую часть времени вы использовали бы dateFormat:'H:i' для поля в модели, полностью пропустив дату. Для поля времени дата является просто заполнителем. При сравнении значений полей времени убедитесь, что поля времени имеют один и тот же initDate (они обычно делают, если вы не переопределяете их).

+0

"* Сама дата представляет собой сложный объект * *, на самом деле это не только ** с момента эпохи и пучки унаследованных методов. Смещение часового пояса не является свойством экземпляра Date, оно извлекается из главной системы. Попробуйте это: создайте дату и вызовите * getTimezoneOffset *. Теперь измените системный часовой пояс и вызовите его снова. Что заставляет людей забирать строки или периодически перемешивать часовые пояса (за ваш ответ). – RobG

+0

В любом случае, я могу полностью удалить 2008-01-01T из метки времени? Все, что я хочу сохранить, - это самое время в базе данных. – Jukebox

+0

При передаче времени для хранения в режиме '' time '' MS SQL Server я использую 'dateFormat: 'H: i: s''. Пожалуйста, обратитесь к документации вашей базы данных для требуемого формата. Если база данных хранит дату вообще, вы используете неправильный тип столбца базы данных. – Alexander

0

Я бы сконфигурировал все разные компоненты в том же формате.

  1. В магазине поле:

    type: "date", 
    dateFormat: "Y-m-d H:i:s" 
    
  2. редактор компонента:

    xtype: "datefieldscheduler", 
    format: "Y-m-d H:i", 
    
  3. к колонку сетки:

    xtype: "datecolumn", // Ext.grid.column.Date 
    format: "Y-m-d H:i:s", 
    renderFormat: "Y-m-d H:i" 
    
  4. В качестве последнего ресурса перезаписи Формат даты (вы можете увидеть здесь формат из базы данных, например)

    Ext.define('Admin.overrides.Date', { 
        override :'Ext.form.field.Date', 
        dateFormat: 'Y-m-d H:i:s', 
        dateReadFormat:'Y-m-d H:i:s', 
        dateWriteFormat : 'Y-m-d H:i:s' 
    }); 
    

В этом примере мы используем тот же формат, внутренне, для отображения в другом формате использование renderFormat.

Смежные вопросы