提问者:小点点

如何将Mongoose/MongoDB中一天的项目从UTC更新为本地时间


我试图更新每天的日志,但我对如何使用UTC和本地时间感到困惑。我正在使用Moment.js尝试查找本地时间从一天开始到一天结束的日志条目,如果当天的条目不存在,则为该日更新一个新条目。MongoDB以UTC时间存储数据。当我将它设置为本地服务器时,我能够让它工作,但是当我部署到Heroku时,它就不能工作了。有什么想法吗?

 await Journal.findOneAndUpdate(
      {
        journal_date: {
          $gte: moment().startOf("day").toString(),
          $lte: moment().endOf("day").toString(),
        }
      },
      {
        journal_date: new Date().toISOString(),
        $push: {
           data: data
        },
      },
      { upsert: true, new: true }
    );

代码应该基本上检查是否存在从一天开始到一天结束(本地时间)的日记帐条目。然后更新数据并使用当前日期作为新的日记帐日期。


共1个答案

匿名用户

将日期/时间值存储为字符串通常是一个设计缺陷,您永远不应该这样做。

我认为.toString()不是您要找的,它返回一个类似Sat Apr 30 2016 16:59:46 GMT-0500的字符串,请尝试.toDate()

您是对的,MongoDB以UTC时间存储数据-总是且仅限于此。通常,客户端负责以本地时间显示日期。所有的运算和比较都是在UTC中完成的。

解决办法可能是这样的:

Journal.findOneAndUpdate(
  {
    journal_date: {
      $gte: moment.tz("Europe/Zurich").startOf("day").toDate(),
      $lte: moment.tz("Europe/Zurich").endOf("day").toDate(),
    }
  },
  {
    journal_date: new Date(),
    $push: {
       data: data
    },
  },
  { upsert: true, new: true }
);

实际上,moment().startOf(“day”).toDate()也应该起作用,它返回当前的本地时间。然而,也许Heroku将当前的区域设置设置为不同的值,所以您可以得到其他的东西。