确定MomentJS过夜午夜的营业时间

时间:2018-03-07 01:52:49

标签: javascript momentjs

我在我的应用中使用MomentJS来确定某个商家目前是否已开启。

我按以下格式存储小时数:

{ open_time: "Thu Jan 01 1970 08:00:00 GMT-0500 (Eastern Standard Time)" },
{ close_time: "Thu Jan 01 1970 23:00:00 GMT-0500 (Eastern Standard Time)" }

在我的代码中:

let openTime = moment(weekday.open_time).format('HH:MM'); // 08:00
let closeTime = moment(weekday.close_time).format('HH:MM'); // 23:00
let currentTime = moment(new Date()).format('HH:MM'); // 20:00

// Determine if business is currently open
let isOpenNow = currentTime >= openTime && currentTime < closeTime ? true : false

除非商家的close_time 午夜或更晚,否则此工作正常,例如:

open_time: 08:00 
close_time: 02:00 // The next day

是否有一种简单的方法可以解决这个问题(或者简单的jane javascript逻辑)?

2 个答案:

答案 0 :(得分:2)

如果您对日期不感兴趣,请将打开和关闭时间存储为时间,而不是日期。然后将打开和关闭时间转换为方便的格式,并与其他时间(可能是当前时间)进行比较。 E.g。

&#13;
&#13;
var times = [{cafe: 'Sally\'s',
              open_time:'08:00', // 8am - 11pm same day
              close_time: '23:00'},
             {cafe: 'Fred\'s',
              open_time:'20:00', // 8pm - 6am next day
              close_time: '06:00'}];


function isOpen(date, times) {
  // Helper to convert HH:mm to milliseconds
  function toMS(s) {
    s = s.split(':');
    return s[0]*3.6e6 + s[1]*6e4;
  }
  // Copy date so don't affect original
  var d = new Date(+date);
  // Get time since midnight for date
  var t = date - d.setHours(0,0,0,0);
  return t >= toMS(times.open_time) &&
         t <= toMS(times.close_time);
}

// Test
var now = new Date().toLocaleString(undefined,{hour12:true,hour:'numeric',minute:'2-digit'})
times.forEach(function(obj){
  console.log(`It's ${now} and ${obj.cafe} is ${isOpen(new Date(), obj)? 'open':'closed'}.`);
})
&#13;
&#13;
&#13;

答案 1 :(得分:0)

好的,该解决方案可以满足我的需求

let times = [{
    cafe: 'Sally\'s',
    open_time:'08:00', 
    close_time: '23:00'
}, {
    cafe: 'Fred\'s',
    open_time:'20:00', 
    close_time: '06:00'
}];

//it is simulated hour after midnight, but you can try with any time
let now = new Date();
now.setHours(2,0,0,0); // 02:00 AM

times.forEach((time: any) => {
    let openTime = moment(time.open_time, "HH:mm");
    let closeTime = moment(time.close_time, "HH:mm");
    if(openTime.isBefore(closeTime)) {
        //normal case
        let isOpen = moment(now).isBetween(openTime, closeTime, null, "[]");
        console.log(`${time.cafe} is ${isOpen ? 'open' : 'closed'}`);
    } else {
        /**
         * First: Note how open and close times switched places
         * Second: the ! in the boolean. If the time is between close and open time, it means the opposite, which is out of range.
         */
        let isOpen = !moment(now).isBetween(closeTime, openTime, null, "[]");
        console.log(`${time.cafe} is ${isOpen ? 'open' : 'closed'}`);
    }
})

我希望它可以帮助某人!