所以我现在遇到的问题是:
我有一个健身课的清单,每个班都有一个OpeningTime。我想把今天所有的课都取下来,但是。在本地和生产中,我没有得到相同的结果,因为由于某种原因,当我将后端部署到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 } }] })所以,就像我之前说过的,问题是,例如:
当我在本地时间(Ex: 02-26-19 21:00 is ( GMT-3) )获取类时,查询实际上显示的是来自02-27的类,因为在我的21:00 h服务器端已经是00:00,所以,日期不再是02-26了。我不想要这样的输出。
我怎样才能解决这个问题呢?
谢谢!)
发布于 2020-02-27 06:38:58
不要使用.format(),这就形成了一个字符串。直接比较Date值,即使用
var now = moment();
var startOfDay = now.startOf('day').toDate();
var endOfDay = now.endOf('day').toDate();默认情况下,moment使用本地时间,因此moment().startOf('day')返回本地时间的午夜。如果你想得到世界协调时的午夜,那么使用moment.utc().startOf('day')。
如果您不依赖于“本地”时区,则可以像moment.tz("America/New_York").startOf('day')一样指定它
无论您需要什么时间,从不按字符串比较日期值,使用始终实际的Date值。
发布于 2020-02-27 04:13:08
默认情况下,在MongoDB中,日期字段存储在UTC中,您可以在写入时创建带有偏移量的日期,以便将其存储在timeZone中。但是在编写文档时没有这样做,那么在从数据库读取数据时,需要将date字段转换为所需的timeZone。请检查下面的示例。
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 } }
])上面的查询是为纽约timeZone编写的,您可以根据您的timeZone来转换它,在测试url中您可以看到第一个文档未被返回,尽管它是在2020-02-26上偏移到纽约的,从今天起是5小时,所以转换后的日期变成了2020-02-25。
测试: MongoDB-游乐场
参考文献: $dateToString
https://stackoverflow.com/questions/60425361
复制相似问题