0

我正在使用 $where 按月份和日期查询对象,使用如下代码获取出生日期为 5 月 7 日的 UserInfo 集合:

db.UserInfo.find( function() {
  var d = new Date(this.Birthdate);
  return d.getDate() === 7 && d.getMonth() === 4;
});

这在本地完美运行,返回生日设置为 5 月 7 日的 UserInfo 对象。但是,这会远程中断(Heroku+Mongolab),因为我取回了 Birthdate 设置为 1210222800000 的对象,例如 5 月 8 日。为什么会发生这种情况,我怎样才能让 mongo 返回正确的对象?

4

1 回答 1

2

它看起来像一个时区问题。我假设您的约会日期都应该是有关日期的“午夜”。这个休息8小时。

# TZ=UTC date -d @1210222800000
Tue Jun  8 08:00:00 UTC 40320

由于 JSON 并没有真正的 Date 类型,因此您必须非常清楚转换发生的位置。最佳实践是应用程序有责任在发送到数据库之前始终转换为 UTC。(如果您只想存储日期,请去掉时间。否则您的日期比较将是错误的。)

在 UTC 时区运行数据库服务器和应用程序服务器也是最佳实践。(如果需要,应用程序应转换为本地时间。通常是每个用户,因为用户通常位于不同的时区。)

于 2013-05-07T21:17:22.067 回答