показывать div, если текущее время пользователя с часовым поясом совпадает с 'часами работы' (ES6) - PullRequest
0 голосов
/ 19 сентября 2019
if (typeof(hoursoperation) != 'undefined' && hoursoperation != null)
    {
      console.log(myJson.acf['office_hours']);



    }

Выше в моей методике Fetch API;Сначала я проверяю, существует ли office_hours;и это так: console.log выше печатает следующие данные:

Array(7)
0:
closing_time: "1600"
day: "7"
starting_time: "0800"
__proto__: Object
1:
closing_time: "1600"
day: "1"
starting_time: "0600"
__proto__: Object
2:
closing_time: "1600"
day: "2"
starting_time: "0600"
__proto__: Object
3: {day: "3", starting_time: "0600", closing_time: "1600"}
4: {day: "4", starting_time: "0600", closing_time: "1600"}
5: {day: "5", starting_time: "0600", closing_time: "1600"}
6: {day: "6", starting_time: "0700", closing_time: "1700"}
length: 7
__proto__: Array(0)

Как я могу узнать местное время пользователей;затем сравните через итерацию вышеупомянутого?

Я знаю, как легко это сделать с jQuery;но я застрял при приближении к этому был ванильный код ES6 javaScript.


то есть Вот как я смог добраться с помощью jQuery: (но все еще ищу метод ES6)

            var today, starttime, endtime;

            var optiondata = JSON.parse(data);

            var officehours = optiondata.acf.office_hours;

            today = new Date();

            var starthour = parseInt(parseInt(officehours[today.getDay()].starting_time)/100);
            var startmin = starthour*100 - parseInt(officehours[today.getDay()].starting_time);

            var endhour = parseInt(parseInt(officehours[today.getDay()].closing_time)/100);
            var endmin = endhour*100 - parseInt(officehours[today.getDay()].closing_time);

            starttime = new Date(today.getFullYear(),today.getMonth(),today.getDate(),starthour,startmin,0,0);

            endtime = new Date(today.getFullYear(),today.getMonth(),today.getDate(),endhour,endmin,0,0);

            // calculate offset for timezones (PST or PDT) to ensure that AlgaeCal is actually open (using Vancouver, B.C.)

            var tzurl = "https://maps.googleapis.com/maps/api/timezone/json?location=49.246670,-123.094729&timestamp=" + parseInt(today.getTime()/1000) + "&key=XXXXX";

            $.ajax({
                url: tzurl,
                dataType: "text",
                success:function(tzdata){
                    $("#hours-operation").hide();

                    var timezonedata = JSON.parse(tzdata);

                    // subtract offsets to get GMT of start and end times of office hours and convert to milliseconds:
                    var chkstarttime = starttime.getTime() - timezonedata.dstOffset*1000 - timezonedata.rawOffset*1000;
                    var chkendtime = endtime.getTime() - timezonedata.dstOffset*1000 - timezonedata.rawOffset*1000;

                    // get offset for current local time and convert to milliseconds
                    var tz = today.toString().split("GMT")[1].split(" (")[0];
                    var chktoday = today.getTime() - parseInt(tz)/100*60*60*1000;

                    // check if current time is truly during open office hours:
                    if(chktoday >= chkstarttime && chktoday <= chkendtime){
                        // show "speak to our bone health specialists message"
                        $("#hours-operation").show();
                    }
                }
            });

        }
    });

1 Ответ

1 голос
/ 19 сентября 2019

Сначала получите текущее время в часовом поясе, относящееся к рабочим часам.Поскольку ваши исходные данные используют формат HHMM, получите время в этом формате также:

// This gives the current local time in Vancouver, in HHMM format, such as 1703 or 0945
const now = new Date().toLocaleTimeString('en-CA', {
    timeZone: 'America/Vancouver', hour12: false, timeStyle: 'short'
    }).replace(':','');

Теперь вы можете просто сравнить значения с вашими исходными данными.Это работает, потому что строки времени в формате HHMM являются лексикографически сортируемыми.

const isActive = starting_time <= closing_time   // test the shift type (normal or inverted)
    ? (starting_time <= now && closing_time > now)   // normal comparison
    : (starting_time <= now || closing_time > now);  // inverted comparison

В приведенных выше комментариях "нормальный" тип смены - это такой, где смена начинается и заканчивается в один и тот же день, например *От 1009 * до 1700.«Инвертированный» тип сдвига - это тип, который охватывает полночь, например от 1800 до 0200.

Обратите внимание, что это работает только в средах, где полностью реализован API интернационализации ECMAScript, включая поддержку часовых поясов.

Также обратите внимание, что в нем не учитываются сдвиги, которые начинаются или заканчиваются в течение неоднозначного часа перехода на переход на летнее время.(Сдвиги, которые полностью окружают DST-переход, должны быть в порядке.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...