首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带MongoDB和NodeJs的时区问题

带MongoDB和NodeJs的时区问题
EN

Stack Overflow用户
提问于 2020-02-27 02:15:46
回答 2查看 319关注 0票数 0

所以我现在遇到的问题是:

我有一个健身课的清单,每个班都有一个OpeningTime。我想把今天所有的课都取下来,但是。在本地和生产中,我没有得到相同的结果,因为由于某种原因,当我将后端部署到Heroku时,时区默认设置为UTC (当我有GMT-3时区时)。

以下是我的疑问:

代码语言:javascript
复制
 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了。我不想要这样的输出。

我怎样才能解决这个问题呢?

谢谢!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-27 06:38:58

不要使用.format(),这就形成了一个字符串。直接比较Date值,即使用

代码语言:javascript
复制
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值。

票数 1
EN

Stack Overflow用户

发布于 2020-02-27 04:13:08

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

JavaScript代码:

代码语言: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

查询:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60425361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档