Определение рабочих часов после полуночи в 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)?

1 ответ

Если вас не интересует дата, сохраняйте время открытия и закрытия как раз, а не как даты. Затем преобразуйте время открытия и закрытия в удобный формат и сравните его с другим временем, может быть, текущим. Например

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'}.`);
})

ОК, решение, которое делает то, что мне нужно:

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'}`);
    }
})

Надеюсь, это кому-нибудь поможет!

Другие вопросы по тегам