Определение рабочих часов после полуночи в 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'}`);
}
})
Надеюсь, это кому-нибудь поможет!