如何在本地时区使用Date对象与Backbone.js同步?

时间:2012-05-04 22:02:47

标签: backbone.js timezone

我正在使用Backbone.js sync将我的模型存储到数据库中。

问题是Backbone.js同步将Date从我的本地时区格式转换为UTC日期。我已将此追溯到Backbone.js同步中使用JSON.stringify

params.data = JSON.stringify(model.toJSON());

作为一个例子,这里发生了什么:

>>> var a = {myDate: new Date();}
>>> JSON.stringify(a);
>>> a
"{"myDate":"2012-05-04T21:58:34.734Z"}"

因此,当我再次使用Backbone.js同步来检索相同的资源时,我的时区将转换为UTC。我希望保留原始的本地时区。

对我来说,只要我以某种方式将数据转换回本地时区,就可以将数据以UTC格式存储到数据库中。

所有帮助都得到了解决。

1 个答案:

答案 0 :(得分:9)

与服务器的所有通信都应以UTC完成,因此JSON.stringify正在按照您的意愿行事。您丢失的部分似乎是将您从服务器获取的UTC时间戳转换为浏览器的本地时区。

通过在模型中提供parse实现,您可以在服务器的JSON进入模型之前拦截服务器的JSON:

  

解析 model.parse(response)

     只要服务器返回模型的数据, fetch save ,就会调用解析。该函数传递原始response对象,并应在模型上返回属性hash set 。默认实现是无操作,只是通过JSON响应。如果您需要使用预先存在的API,或者更好地命名您的响应,请覆盖此项。

这会在{myDate: '2012-05-04T21:58:34.734Z'}中为您提供一个对象response,因此您只需将其转换为您当地的时区即可。 Date.parsenew Date的快速组合将在浏览器的时区中为您提供Date对象:

var d = new Date(Date.parse(response.myDate));
// Fri May 04 2012 14:58:34 GMT-0700 (PDT)

如果你想在模型中使用Date对象,那么你只需要返回包裹在对象中的Date:

return { myDate: d };

或者,如果response有更多可以做的事情:

response.myDate = d;
return response;
// or if you don't want to modify response
return _({}).extend(response, { myDate: d });

如果您出于某种原因想在浏览器的时区中使用ISO-8601字符串,那么您可以使用标准的Date方法轻松构建一个字符串。我认为你最好保留Date对象,这比字符串更有用。