Поэтому у меня есть этот скрипт:
function makeActive() {
var element, name, arr;
element = document.getElementById("liveChat");
name = "active";
arr = element.className.split(" ");
if (arr.indexOf(name) == -1) {
element.className += " " + name;
}
}
var currentTime = new Date();
var currentTimeFormatted = currentTime.toLocaleTimeString();
if(currentTimeFormatted >= ང:00:00' && currentTimeFormatted <= ཌ:30:00'){
makeActive();
}
Что отлично работает в Chrome, однако в IE класс не добавляется.
Если я удалю
&& currentTimeFormatted <= ཌ:30:00'
IE также добавляет класс. Почему бы добавить второе условие, разбить этот скрипт в IE?
Всего 3 ответа
Вы выполняете строковые сравнения, а это значит, что зависимый от браузера и locale вывод toLocaleTimeString()
закручивает ваш код в IE и, возможно, также в других браузерах или регионах, потому что эта функция предназначена исключительно для создания пользовательского представления времени.
Поэтому вы должны:
(1) Использовать строковое представление, стандартизованное, например, обращение toISOString()
. Это также избавит вас от проблем с часовым поясом, потому что результат всегда будет в UTC:
var currentTimeFormatted = new Date().toISOString(); // 2018-11-07T12:28:12.448Z'
currentTimeFormatted = currentTimeFormatted.substr(currentTimeFormatted.indexOf('T') + 1, 8); // 12:27:12
Теперь остальная часть вашего кода будет работать (если вы 08:00:00 и 16:30:00 - UTC).
(2) Извлеките часовую и минутную части new Date()
и сравните их с целыми числами:
var currentTime = new Date();
if(currentTime.getHours() >= 8
&& // similarly a comparison to < 16:30
) {
makeActive();
}
(3) Используйте великое решение Кейта (см. Ниже), который, я думаю, лучший способ пойти
Чтобы сделать это немного проще, чем использовать && и || mix, или если ваши значения хранятся где-то в статическом файле и т. д. Вы могли бы создать своего рода псевдо-время, умножая каждую секцию.
например.
const cTime = new Date(); const ptime = cTime.getHours() * 10000 + cTime.getMinutes() * 100 + cTime.getSeconds(); if (ptime >= 80000 && ptime <= 163000) { console.log("Active"); } else { console.log("InActive"); }
Реализация IE date.toLocaleTimeString () добавляет непечатаемые символы в строку. Самый простой способ справиться с ними - обрезать их из строки;
currentTimeFormatted = currentTime.toLocaleTimeString().replace(/[^ -~]/g,'')
Когда вы работаете с локализованными часовыми поясами и сравнением с часовым поясом , возможно, стоит попробовать библиотеку, например moment.js, которая также может иметь дело со сравнением значений с помощью функции isBetween funciton
редактировать
Как предложили другие решения - использование toLocaleTimeString()
не является безопасным методом сравнения дат, и его следует избегать.