我正在尝试根据东部时区(NYC)显示周一至周五上午8点到下午6点之间显示的在线聊天div,如果离线则不显示任何内容,以便来自北京的客户将根据这些时间在线或离线查看。
只需显示()或隐藏() div即可。到目前为止,我有小时数,但我不确定如何使它们与用户时区相关。
$(document).ready(function () {
var start = new Date();
var end = new Date();
var time = new Date().getTime();
if (time > start.setHours(8,00) && time < end.setHours(18,00)) {
$('.online').show();
}
else {
$('.offline').hide();
}
});发布于 2018-09-13 05:01:11
之前的答案(seen in edit history)是使用UTC的偏移量,但是,如果您想支持夏令时,这将不是一个选项;这是一件重要的事情。
因此,对先前建议的修改完全删除了UTC的使用。为了支持夏令时,从EST获取时间的唯一正确方法是将地区设置为该位置,读取时间,设置一个新的date对象(从技术上讲,该对象将在客户端本地设置,但我们真正想要的是来自Date对象的日期和小时响应,因此我们将忽略该技术细节)。
这是通过使用toLocaleString调用传递一个指定时区的对象,然后使用该结果构造一个新日期来完成的。
var NYDate = new Date(new Date().toLocaleString("en-US", {timeZone: "America/New_York"}));
var NYHour = NYDate.getHours();
var NYDay = NYDate.getDay()
if (NYHour >= 8 && NYHour <= 18 &&
NYDay > 0 && NYDay < 6) {
$('.online').show();
}else {
$('.online').hide();
}.online {
display: none;
color: green;
}<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="online">Online</div>
发布于 2018-09-13 06:41:24
不需要JavaScript。您应该从服务器端执行此操作。(顾客不会告诉商店什么时候开门,商店会告诉顾客!)
假设您的HTML是由某种服务器端语言(PHP、Ruby等)生成的,将程序设置为使用纽约时间,并简单地计算您是否处于“打开”时间内。如果你是打开的,生成聊天div。如果你关门了。别。
(或者,通过CSS和类显示/隐藏它)
发布于 2018-09-13 14:19:28
事实证明,使用JavaScript并不是一项完全微不足道的任务(正如在@StephenR的回答中所指出的,这可能更容易处理服务器端)。正如在一些评论中所指出的,使用库可能是更好的js方法。
也就是说,在思考了@RobG关于浏览器对toLocaleString中timeZone等选项的不同支持的评论后,我很好奇用另一种方式来解决这个问题(这让我对各种js日期库心存感激)。下面的代码片段...
const getOffset = (month, date, day, hour) => {
// assume EST offset
let offset = 5;
// adjust to EST offset as needed
if ((month > 2 && month < 10) || (month === 2 && date > 14)) {
offset = 4;
} else if (month === 2 && date > 7 && date < 15) {
if ((day && date - day > 7) || (day === 0 && hour - offset >= 2)) {
offset = 4;
}
} else if (month === 10 && date < 8) {
if ((day && date - day < 0) || (day === 0 && hour - offset < 1)) {
offset = 4;
}
}
return offset;
};
const isOnline = () => {
const dt = new Date(); // current datetime
let year = dt.getUTCFullYear(); // utc year
let month = dt.getUTCMonth(); // utc month (jan is 0)
let date = dt.getUTCDate(); // utc date
let hour = dt.getUTCHours(); // utc hours (midnight is 0)
let day = dt.getUTCDay(); // utc weekday (sunday is 0)
let offset = getOffset(month, date, day, hour);
if (hour - offset < 0) {
hour = 24 + hour - offset;
day = day ? day - 1 : 6;
if (date === 1) {
if (!month) {
year -= 1;
month = 11;
} else {
month -= 1;
}
date = new Date(year, month + 1, 0).getDate();
} else {
date -= 1;
}
} else {
hour -= offset;
}
if (day > 0 && day < 6 && hour > 7 && hour < 19) {
return true;
}
return false;
};
if (isOnline()) {
console.log('online'); // handle online
} else {
console.log('offline'); // handle offline
}
https://stackoverflow.com/questions/52303123
复制相似问题