MongoDB和NodeJ的时区问题



所以我目前遇到的问题是:

我有一份健身房课程清单,每节课都有一个开放时间。我想把当天所有的课都拿出来,但是。我在本地和生产中都没有得到相同的结果,因为某种原因,当我将后端部署到Heroku时,时区默认设置为UTC(当我有GMT-3时区时(。

这是我的问题:

var now = moment();
var startOfDay = now.startOf('day').format();
var endOfDay = now.endOf('day').format();
var clasesDB = await Clase.find({ $and: [{ openingTime: { $gte: startOfDay } }, { openingTime: { $lte: endOfDay } }] })

所以,就像我之前所说的,问题出现在什么时候,例如:

当我在本地时间(例如:02-26-19 21:00hs(GMT-3((获取类时,查询实际上显示的是02-27的类,因为在MINE 21:00hs,服务器端已经是00:00,所以日期不再是02-26。我不想要这种输出。

如何找到解决此问题的变通方法?

提前感谢!:(

不要使用.format(),这会生成字符串。直接比较Date值,即使用

var now = moment();
var startOfDay = now.startOf('day').toDate();    
var endOfDay = now.endOf('day').toDate();

默认情况下,moment使用本地时间,因此moment().startOf('day')返回本地时间的午夜。如果你想得到UTC的午夜,那么使用moment.utc().startOf('day')

如果你不依赖"本地"时区,那么你可以像moment.tz("America/New_York").startOf('day')一样指定它

无论您需要什么时间,永远不要按字符串比较日期值,始终使用实际的Date值。

默认情况下,MongoDB中的日期字段存储在UTC中,您可以在写入时创建一个带偏移量的日期,将其存储在您的时区中。但若在编写文档时并没有这样做,那个么在从数据库中读取数据时需要将日期字段转换为所需的时区。检查以下示例。

JavaScript代码:

const today = new Date().toLocaleDateString(undefined, {
day: '2-digit',
month: '2-digit',
year: 'numeric'
})  // 02/26/2020. If your Heroic server is in different location then specify your locale in place of undefined - whereas undefined picks local time by default. Ex:- 'en-Us' for USA

查询:

db.collection.aggregate([
{ $addFields: { timewithOffsetNY: { $dateToString: { format: "%m/%d/%Y", date: "$openingTime", timezone: "America/New_York" } } } },
{ $match: { timewithOffsetNY: today } }, { $project: { timewithOffsetNY: 0 } }
])

上面的查询是为纽约时区写的,你可以根据你的时区进行转换,在测试url中你可以看到第一张单据虽然在2020-02-26上,但没有返回,因为截至今天到纽约的偏移是5小时,所以转换后的日期变成了2020-02-25

测试:MongoDB Playground

参考:$dateToString

最新更新