如何使用 autoform 和 moment 库正确处理流星中的 GMT 偏移量/时区

How to properly deal with GMT offsets / timezones in meteor with autoform and moment library

我 运行 在使用 dates/times 与 mongo 和自动表单时遇到问题。

我从另一个数据库系统开始迁移,我在其中将日期存储为字符串。

迁移发生在 PHP,我使用以下方法转换为 Mongo 日期:

return new MongoDate(strtotime($date));

因此,例如,我从 7/30/1960(1960 年 7 月 30 日)开始

在 Mongodb 中,我看到:

ISODate("1960-07-30T05:00:00.000+0000"),

而且,当我使用助手和 moment 库在 table 网格中查看时:

Template.registerHelper("mdy", function (date) {
  if (date) {
    return moment(date).format('MM/DD/YYYY');
  }
});

我得到: 1960 年 7 月 30 日

然后,我在一个表单中打开它,使用 autoForm 和这样的架构:

someDate: {
type: Date,
}

我仍然看到 07/30/1960

然后我将其保存到数据库中,然后在数据库中查看保存的内容:

ISODate("1960-07-30T00:00:00.000+0000"),

(注意从T05变成了T00)

现在当我在 table 网格中显示时,我看到:

07/29/1960

但有趣的是,如果我在 autoform 中再次打开该记录,它会显示 07/30/1960

所以显然时区或 GMT 偏移或类似问题出现了问题

有人知道我错过了什么吗?

编辑:有趣的观察...我昨天记录了这个问题,4 月 28 日星期二,今天是 4 月 29 日星期三,但问题仍然是 "asked today"

编辑:添加 mongodb 标签...如果这不是 mongo 问题,你们 mongo 可以删除标签!

我找到的解决方案是使用 moment.utc(date) 来格式化日期,而不仅仅是 moment(date)。

因此,助手将是:

Template.registerHelper("mdy", function (date) {
  if (date) {
    return moment.utc(date).format('MM/DD/YYYY');
  }
});

感谢: http://blog.skylight.io/bringing-sanity-to-javascript-utc-dates-with-moment-js-and-ember-data/ 为了朝着正确的方向前进!