当ember-data进行序列化时,修改日期格式的最佳方法是什么?

时间:2013-03-29 01:07:53

标签: ember.js ember-data

在我的ember-data适配器中,我使用这一行来序列化我的模型

var data  = record.serialize();

但我注意到我的模型有日期类型......

App.Foo = DS.Model.extend({
    start: DS.attr('date')
});

...会将这样的日期发布到我的REST api

  

周六,2013年3月2日22:15:00 GMT

但我需要更友好的api友好的东西,比如yyyy-mm-dd或mm / dd / yyyy

ember-data是否提供了一个钩子来改变通过线路发送日期的方式?

我认为不是因为这是ember-data rev 11中serialize方法的实际返回行

return dayOfWeek + ", " + dayOfMonth + " " + month + " " + utcYear + " " + pad(utcHours) + ":" + pad(utcMinutes) + ":" + pad(utcSeconds) + " GMT";

更新

我还在ember-data上打开了一个问题,看看为什么选择这种格式

https://github.com/emberjs/data/issues/845

3 个答案:

答案 0 :(得分:12)

您可以按照此answer中建议的Jakub注册新转换。使用Ember Data 1.0.beta.1,您必须在应用上create a new transform,如下所示:

App.IsodateTransform = DS.Transform.extend({
  deserialize: function (serialized) {
    if (serialized) {
      return moment(serialized).toDate();
    }
    return serialized;
  },

  serialize: function (deserialized) {
    if (deserialized) {
      return moment(deserialized).toISOString();
    }
    return deserialized;
  }
});

如果不使用moment.js,您可以更改serializedeserialize定义。

答案 1 :(得分:8)

Ember-Rails解决方案:

我在ember-rails应用中使用 ember-data 0.13 / ember.js 1.0.0.rc5 。 我发现我必须执行以下操作才能将javascript日期与rails日期相匹配。

# Transforms Date to avoid miss-match with rails date
DS.JSONTransforms.isodate =
  deserialize: (serialized) ->
    if serialized
      date = new Date(serialized)
      offset = date.getTimezoneOffset()
      new Date(date.getTime()+offset*60000)
    else 
      null

  serialize: (date) ->
    if date then moment(date).format("YYYY-MM-DD") else null

*我正在使用moment.js进行序列化,但这可能不是你自己难以做到的。

答案 2 :(得分:2)

不依赖于moment.js的版本

取自https://github.com/toranb/ember-data-django-rest-adapter/issues/26

  App.IsodateTransform = DS.Transform.extend({
    deserialize: function(serialized) {

      var type = typeof serialized;

      if (type === "string") {
        return new Date(Ember.Date.parse(serialized));
      } else if (type === "number") {
        return new Date(serialized);
      } else if (serialized === null || serialized === undefined) {
        // if the value is not present in the data,
        // return undefined, not null.
        return serialized;
      } else {
        return null;
      }
    },

    serialize: function(date) {
      if (date instanceof Date) {
        return date.toJSON();
      } else {
        return null;
      }
    }
  });