gpt4 book ai didi

Javascript 运行时间使用 getTimezoneOffset 检查日期和时间

转载 作者:行者123 更新时间:2023-12-03 12:31:43 24 4
gpt4 key购买 nike

更新:请参阅下面的原始帖子。

开始原创帖子
如果用户在聊天时间之外访问该网站,则正在努力将客户的聊天按钮更改为“离线模式”。

工作时间为周一至周五上午 9 点至下午 5 点东部时间(美国时间,而非澳大利亚时间)。当我说东部时间时,确实需要考虑 EST/EDT 的冬季/夏季月份。

冬季(11 月第 1 个星期日至 3 月第 2 个星期日)EST 为 UTC - 5
夏季,EDT 为 UTC - 4(3 月的第 2 个星期日至 11 月的第 1 个星期日)

为了避免出现问题(访问者可能没有正确设置计算机时间),我选择使用 getUTCDay()getUTCHours() 而不是 getDay()getHours()

为了将 UTC 时间转换为 EST/EDT,我从 getUTCHours() 中减去 getTimezoneOffset()(将 getTimezoneOffset() 除以 60)首先获得小时而不是分钟)。我采用这种方法的原因是因为根据 Spec getTimezoneOffset() 不是常量,并且会考虑夏令时。

一切看起来都很好(我认为),直到 if 语句(我认为这是我出错的地方)

fiddle 链接: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();

fiddle 链接:http://jsfiddle.net/TLJsv/

在测试过程中,我将第 23、27 和 31 行中的数字(当前为数字 9 和数字 17)更改为不同的值,以确认聊天链接进入离线模式。并不是每次都有效。我认为问题在于第 23 行的 if 语句(它检查时间是否早于上午 9 点)。接下来的两个似乎工作正常。

对此的任何帮助或改进将不胜感激!
结束原帖



更新
我意识到我的最后两个 else if 顺序错误,我已经更新了 fiddle http://jsfiddle.net/TLJsv/3/

最佳答案

如果您不希望用户的时钟发挥作用,则必须在服务器上执行此操作。 getUTCHours 中没有任何魔法可以到达服务器的时间。它仍然使用 Date 对象中的时间,该时间是从用户的时钟获取的。

但是,如果您不关心这一点,那么在客户端 JavaScript 中执行此操作的最简单方法是使用 moment.jsmoment-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();
}

另请注意,当涉及到包含时间的范围时,人们通常将其视为半开区间(即 9AM-5PM 包括 9AM,但不包括 5PM)。当范围不包含时间时,人们通常认为它是一个完全包含的时间间隔(即周一至周五是 5 天,而不是 4 天)。

关于Javascript 运行时间使用 getTimezoneOffset 检查日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23894173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com