перекрывающиеся часы в javascript

Я имею дело с проблемой перекрытия часов. История такова — у меня есть сайт с барами и системой, которая должна показать пользователю, какой бар открыт прямо сейчас. Что сложно, когда я использую метод проверки времени в этот текущий день я не могу, потому что часы идет также на следующий день. Например. один паб открывается в 9 утра и закрывается в 2 часа ночи на следующий день. Как я могу это решить, мой код ниже-я получаю время в JSON.

    var current_time = new Date().toLocaleTimeString('en-US', { hour12: false, hour: "numeric", minute: "numeric"});

    var d = new Date();
    var weekday = new Array(7);
    weekday[0]=  "sundayStart";
    weekday[1] = "mondayStart";
    weekday[2] = "tuesdayStart";
    weekday[3] = "wednesdayStart";
    weekday[4] = "thursdayStart";
    weekday[5] = "fridayStart";
    weekday[6] = "saturdayStart";
    var n = weekday[d.getDay()];

    var weekday1 = new Array(7);
    weekday1[0]=  "sundayEnd";
    weekday1[1] = "mondayEnd";
    weekday1[2] = "tuesdayEnd";
    weekday1[3] = "wednesdayEnd";
    weekday1[4] = "thursdayEnd";
    weekday1[5] = "fridayEnd";
    weekday1[6] = "saturdayEnd";
    var m = weekday1[d.getDay()];

Таким образом, этот код сначала проверяет, какой день сейчас, а затем находит значения в пределах начального и конечного значений массива. Я не могу использовать метод between из-за того, что перекрывающиеся значения в следующий день. Заранее большое спасибо.

2 ответа

  1. Один из способов состоит в том, чтобы иметь несколько диапазонов для каждого дня, чтобы они не пересекали полночь. Поэтому вместо того, чтобы сказать, что он открывается в понедельник с 9 утра до 2 утра, и вторник с 10 утра до 3 утра, сделайте это как:

    Monday: 09:00 - 23:59
    Tuesday: 00:00 - 02:00, 10:00-23:59
    Wednesday: 00:00 - 03:00
    

    Таким образом, каждый день недели будет иметь массив {open: xxx, close: xxx}объектов. Циклический просмотр всех объектов за текущий день и возвратtrue, если текущее время находится в любом из диапазонов.

    Если ваш входной JSON не похож на этот, вы можете создать его путем обработки входных данных. Если время закрытия меньше времени открытия, разделите его на два диапазона. Первый диапазон — от времени открытия до 23:59того же дня, второй диапазон-от 00:00времени закрытия на следующий день.

  2. Вы можете выразить время открытия и закрытия как начало и продолжительность, поэтому, если бар1 открывается в 9 утра и закрывается в 2 часа ночи на следующий день и бар 2 открывается в 3 часа дня и закрывается в 6:30 утра на следующий день, у вас будет:

    1. bar1: 09:00, 17: 00
    2. bar2: 15: 00, 15: 30

    var times = {bar1: ['09:00', '17:00'], bar2: ['15:00', '15:30']};
    
    function showBarTimes(data) {
      Object.keys(data).forEach(function(bar) {
        var open = new Date();
        var openTime = times[bar][0].split(':');
        var duration = times[bar][1].split(':');
        open.setHours(openTime[0], openTime[1], 0,0);
        var close = new Date(+open);
        close.setHours(close.getHours() + +duration[0], close.getMinutes() + +duration[1]);
        var now = new Date();
        var currentlyOpen = now >= open && now <= close;
    
        console.log(bar + ' opens at ' +
                    open.toLocaleString() + ' and closes at ' +
                    close.toLocaleString() + ' and is currently ' + 
                    (currentlyOpen? 'OPEN':'CLOSED'));
      });
    }
    showBarTimes(times);