如何在MongoDB中建模和查询办公时间(日期、时区、dst)

How to model and query Office Hours in MongoDB (dates, timezones, dst)

本文关键字:日期 时间 时区 dst MongoDB 建模 查询      更新时间:2023-09-26

每周办公时间:周一、周五、周五上午10点->上午11:45

我想跟踪一组人的办公时间。当他们的时间开始时,我想setSign('open')。当它们结束时,setSign('closed')

这种模式显然已被打破。在MongoDB中,如何在尊重时区的情况下进行建模和查询是个问题。

people.find({});
[{
  name: 'hank',
  days: [1,3,5], // mon,wed,fri
  start: '08:00',
  end: '17:00,
  lastSign: 'new',
}]

所以,每5分钟,我运行一个查询:

var hoursNowOpen = people.find({
  lastSign: { $ne: 'open' },
  ????
});
// Set to open
hoursNowOpen.forEach(function(person) { person.setSign('open');});
// Mark we set the sign to open
var ids = hoursNowOpen.map(function(person) { return person._id;});
people.update({_id: {$in: ids}}, { lastSign: 'open' });

我非常讨厌时区和dst。谢谢你的帮助!

Mike

模型中唯一缺少的是时区标识符,如America/New_YorkAsia/Tokyo,假设每个人可能在不同的时区。如果它们都在同一时区,那么您只需要在应用程序逻辑中知道该时区。

但是,这对查询没有帮助。为此,您必须将每个事件投影为一组基于UTC的日期+时间值。总有一个折衷方案。如果你的人数相对较少,你可以将他们全部加载,并根据规则测试当前日期。

如果你有很多人,那么你肯定需要定期预测每个事件,这样你就可以根据当前UTC时间进行简单的范围查询,看看谁是开放的。