所以我有这个脚本:
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 >= '08:00:00' && currentTimeFormatted <= '16:30:00'){
makeActive();
}
在Chrome中可以完美地工作,但是在IE中不会添加该类。
如果我删除
&& currentTimeFormatted <= '16:30:00'
IE也添加了该类。为什么还要添加第二个条件,从而在IE中破坏此脚本?
答案 0 :(得分:1)
使此操作比必须使用&&和||更容易混合,或者如果您的值存储在静态文件中的某个位置等。您可以通过将每个部分相乘来创建一种伪时间。
例如
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");
}
答案 1 :(得分:0)
您正在进行字符串比较,这意味着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
现在您的其余代码将正常工作(假设您是UTC时间08:00:00和16:30:00)。
(2)提取new Date()
的小时和分钟部分,并将它们与整数进行比较:
var currentTime = new Date();
if(currentTime.getHours() >= 8
&& // similarly a comparison to < 16:30
) {
makeActive();
}
(3)使用Keith的出色解决方案(见下文),我认为这是最好的解决方法
答案 2 :(得分:-1)
IE的date.toLocaleTimeString()实现将不可打印的字符添加到字符串中。处理它们的最简单方法是从字符串中修剪它们;
currentTimeFormatted = currentTime.toLocaleTimeString().replace(/[^ -~]/g,'')
在处理本地时区和时区比较时,可能值得尝试像moment.js这样的库,该库也可以使用isBetween funciton来比较值。
修改
如其他解决方案所建议的那样-使用toLocaleTimeString()
并不是执行日期比较的安全方法,应避免使用。