我试图更新每天的日志,但我对如何使用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 }
);
代码应该基本上检查是否存在从一天开始到一天结束(本地时间)的日记帐条目。然后更新数据并使用当前日期作为新的日记帐日期。
将日期/时间值存储为字符串通常是一个设计缺陷,您永远不应该这样做。
我认为.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将当前的区域设置设置为不同的值,所以您可以得到其他的东西。