Как обрабатывать даты в Backbone?

Я храню даты в формате DATETIME в базе данных MySQL. Когда модель извлекается из базы данных, даты (в формате DATETIME) преобразуются в объекты даты в методе инициализации модели. Пока все хорошо.

Когда модель сохраняется на сервере, объекты даты должны быть преобразованы обратно в формат DATETIME, чтобы код на стороне сервера правильно интерпретировал даты. Я использовал всевозможные хакеры для этого, но мне интересно, , на каком этапе может сохранить метод сохранения я могу безопасно преобразовать даты в формат DATETIME?

Один из подходов состоит в том, чтобы сделать следующее:

this.model.save({
    date : date.toDateTime()
}, options);

Однако это приводит к тому, что событие изменения запускается с момента хэша атрибутов до того, как метод сохранения не совпадает с хешем после события сохранения (и это вызывает метод установки базовой линии).

Ответ 1

Я бы посоветовал использовать UNIX time (количество секунд/миллисекунд с 1970) как в модели, так и в интерфейсе и конвертировать только на читаемую дату в View.

Таким образом, сервер отправляет и получает даты как цифры, такие как 1328281766454, и именно так вы храните их в Backbone.Model. Когда это нужно сделать в View, вы можете просто вызвать:

new Date(this.model.get('someTime'));  //Fri Feb 03 2012 16:09:26 GMT+0100 (CET)

То же самое можно сделать на стороне сервера. Поверьте мне, это самый простой и самый переносимый способ передачи дат без всех этих часовых поясов.

Ответ 2

Я сделал бы это одно из двух мест:

  • На сервере:

    Это, вероятно, имеет наибольший смысл, поскольку ваша реализация на стороне сервера действительно та, которая нуждается в представлении DATETIME; ваш код клиента не должен заботиться вообще.

  • В toJSON() вашей модели:

    Если вы должны сделать это на клиенте, переопределите Backbone.Model toJSON() для своей модели и обновите ее там. Пример:

    toJSON: function () {
        var json = Backbone.Model.prototype.toJSON.call(this);
        json.date = convertDate(this.get('date'));
        return json;
    }
    

    Если вы сделаете это, вам нужно будет преобразовать дату назад, либо в вашу модель initialize(), либо parse().

Ответ 3

Не может быть ответа на ваш вопрос - но видели, как люди используют time.js для форматирования времени в магистрали -

http://momentjs.com/