1

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

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

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 存储到数据库中,只要我设法将其转换回本地时区。

所有的帮助都是值得的。

4

1 回答 1

9

与服务器的所有通信都应该在 UTC 中完成,所以按照JSON.stringify您的意愿进行。您缺少的部分似乎是将您从服务器获得的 UTC 时间戳转换为浏览器的本地时区。

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

解析 model.parse(response)

每当服务器返回模型的数据时,在fetchsave中都会调用parse。该函数传递原始response对象,并应返回要在模型上设置的属性哈希。默认实现是无操作的,只是通过 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 对象,这比字符串有用得多。

于 2012-05-05T01:37:24.650 回答