jsa*_*nen 1 timezone backbone.js
我使用Backbone.js同步将我的模型存储到数据库.
问题是Backbone.js同步将Date从我的本地时区格式转换为UTC日期.我已经追溯到JSON.stringifyBackbone.js同步中的使用:
params.data = JSON.stringify(model.toJSON());
Run Code Online (Sandbox Code Playgroud)
举个例子,这里发生了什么:
>>> var a = {myDate: new Date();}
>>> JSON.stringify(a);
>>> a
"{"myDate":"2012-05-04T21:58:34.734Z"}"
Run Code Online (Sandbox Code Playgroud)
因此,当我再次使用Backbone.js同步来检索相同的资源时,我的时区将转换为UTC.我希望保留原始的本地时区.
对我来说,只要我以某种方式将数据转换回本地时区,就可以将数据作为UTC存储到数据库中.
所有的帮助都是适当的.
与服务器的所有通信都应以UTC完成,因此JSON.stringify正在按照您的意愿进行.您丢失的部分似乎是将从服务器获取的UTC时间戳转换为浏览器的本地时区.
通过在模型中提供parse实现,您可以在服务器的JSON进入模型之前拦截它:
解析
model.parse(response)只要服务器返回模型的数据,在获取和保存时,就会调用parse.该函数传递给原始
response对象,并应返回要在模型上设置的属性hash .默认实现是无操作,只是通过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)
Run Code Online (Sandbox Code Playgroud)
如果你想在模型中使用Date对象,那么你只需要返回包装在对象中的Date:
return { myDate: d };
Run Code Online (Sandbox Code Playgroud)
或者,如果response有更多的东西你可以:
response.myDate = d;
return response;
// or if you don't want to modify response
return _({}).extend(response, { myDate: d });
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因你想在浏览器的时区中使用ISO-8601字符串,那么你可以使用标准的Date方法轻松地构建一个字符串.我认为你最好保留Date对象,这比字符串更有用.
| 归档时间: |
|
| 查看次数: |
3617 次 |
| 最近记录: |