我正在使用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格式存储到数据库中。
所有帮助都得到了解决。
答案 0 :(得分:9)
与服务器的所有通信都应以UTC完成,因此JSON.stringify
正在按照您的意愿行事。您丢失的部分似乎是将您从服务器获取的UTC时间戳转换为浏览器的本地时区。
通过在模型中提供parse
实现,您可以在服务器的JSON进入模型之前拦截服务器的JSON:
解析
只要服务器返回模型的数据, fetch 和 save ,就会调用解析。该函数传递原始model.parse(response)
response
对象,并应在模型上返回属性hash set 。默认实现是无操作,只是通过JSON响应。如果您需要使用预先存在的API,或者更好地命名您的响应,请覆盖此项。
这会在{myDate: '2012-05-04T21:58:34.734Z'}
中为您提供一个对象response
,因此您只需将其转换为您当地的时区即可。 Date.parse
和new 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对象,这比字符串更有用。