所以我目前遇到的问题是:
我有一份健身房课程清单,每节课都有一个开放时间。我想把当天所有的课都拿出来,但是。我在本地和生产中都没有得到相同的结果,因为某种原因,当我将后端部署到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