已更新:请参阅以下原始帖子。
开始原始帖子
如果用户在聊天时间之外访问该网站,则将我的客户聊天按钮更改为“离线模式”。
营业时间为美国东部时间周一至周五上午9点至下午5点(美国,非澳大利亚)。当我说东部时间时,确实需要考虑EST / EDT的冬/夏月。
EST为冬季的UTC - 5(11月的第1个星期日,3月的第2个星期日) EDT为UTC - 4夏季(3月的第2个星期日至11月的第1个星期日)
为避免出现问题(访问者可能没有正确设置计算机时间),我选择使用getUTCDay()
和getUTCHours()
代替getDay()
和getHours()
。
要将UTC时间转换为EST / EDT,我从getTimezoneOffset()
中减去getUTCHours()
(将getTimezoneOffset()
除以60,得到小时而不是先分钟)。我使用此方法的原因是因为根据Spec getTimezoneOffset()
不是常量并且考虑了夏令时。
一切似乎都很好(我认为)直到if语句(我相信我错了)。
小提琴链接:http://jsfiddle.net/TLJsv/
的Javascript
function chatOffline() {
var d = new Date();
var currentMonth = d.getUTCMonth();
var currentDay = d.getUTCDay();
var currentHours = d.getUTCHours();
var currentMinutes = d.getUTCMinutes();
var currentSeconds = d.getUTCSeconds();
var offSet = d.getTimezoneOffset() / 60;
var offMode = function offMode() {
jQuery('.initChat').css('background-position', '-68px 0px'); //switches sprite to offline position
jQuery('.initChat').css('cursor', 'context-menu'); //changes cursor so button appears to be not clickable
};
//set UTC time to either EST or EDT
currentHours -= offSet;
//check if day is between Mon-Fri
if (currentDay < 1) {
offMode(); // It's Sunday
} else if (currentDay > 5) {
offMode(); // It's Saturday
} else {
//check if time is earlier than 9am
if (currentHours < 9) {
offMode(); // It's before 9am ET
} else if
//check if time is later than 5pm
(currentHours > 17) {
offMode(); // It's after 5pm ET
} else if
//check if it is 5pm
(currentHours == 17) {
//if it's past 5pm, even by a second, go offline
if (currentSeconds > 0) {
offMode(); // It's after 5pm ET
}
}
}
}
chatOffline();
小提琴链接:http://jsfiddle.net/TLJsv/
在测试期间,我将第23,27和31行(当前数字9和数字17)中的数字更改为不同的值,以确认聊天链接进入离线模式。它不是每次都有效。我认为问题在于第23行的if语句(检查时间是否早于上午9点)。接下来的两个似乎工作正常。
对此有任何帮助或改进将不胜感激!
结束原始帖子
的更新
我意识到我的最后2 else if
命令错误,我更新了小提琴http://jsfiddle.net/TLJsv/3/
答案 0 :(得分:1)
如果您不想让用户的时钟发挥作用,您必须在服务器上执行此操作。 getUTCHours
中没有任何魔法可以延伸到服务器的时间。它仍然使用Date
对象中的时间,该时间是从用户的时钟获得的。
但是,如果您不关心这一点,那么在客户端JavaScript中执行此操作的最简单方法是将moment.js与moment-timezone加载项一起使用。
var m = moment().tz("America/New_York"); // US Eastern Time Zone
if (m.day() < 1 || m.day() > 5 || m.hour() < 9 || m.hour() >= 17) {
offMode();
}
另请注意,当涉及到包含时间的范围时,人类通常意味着这是半开放间隔(即,上午9点至下午5点包括上午9点,但不包括下午5点)。当范围不包括时间时,人类通常意味着它是一个完全包容的区间(即周一至周五是5天,而不是4)。