根据远程时区和日期显示div

我正在尝试显示一个聊天div,显示在星期一到星期五上午8点到下午6点之间的“在线”,或者根据东部时区(NYC)显示离线显示,以便北京的客户可以看到在线或离线基于这些时间。

只需要显示()或隐藏()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(); } }); 

之前的答案( 在编辑历史记录中看到 )是使用UTC的偏移量,但是如果您想支持夏令时,这不是一个选项。 这是一件很重要的事情。

因此,对先前建议的修改完全消除了UTC的使用。 为了支持夏令时,从EST获取时间的唯一正确方法是将语言环境设置为该位置,读取时间,设置新的日期对象(技术上将在客户端本地设置,但是我们真正想要的只是来自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; } 
  
Online

不需要JavaScript。 您应该从服务器端执行此操作。 (顾客在商店打开时不告诉商店,商店告诉顾客!)

假设您的HTML是由某些服务器端语言(PHP,Ruby等)生成的,请将程序设置为使用纽约时间,并简单地计算您是否在“打开”时间内。 如果您已打开,请生成聊天div。 如果你关闭了……不要。

(或者,通过CSS和类显示/隐藏它)

事实certificate,这不是一个使用JavaScript的完全无关紧要的任务(如@StephenR的回答所述 ,这可能更容易处理服务器端)。 正如一些评论中所指出的,使用库可能是更好的js方法。

也就是说,在考虑了@RobG关于不同浏览器对timeZone中的timeZone选项的支持的评论之后,我很好奇解决这个问题需要另外一种方式(让我感激各种js日期库)。 下面的片段……

 let d = new Date(); // current datetime let month = d.getUTCMonth(); // utc month (jan is 0) let date = d.getUTCDate(); // utc date let hour = d.getUTCHours(); // utc hours (midnight is 0) let day = d.getUTCDay(); // utc weekday (sunday is 0) let offset = 4; // assume EDT to start let adjust = 1; // offset adjustment at DST let mar = (month === 2); // march boolean let nov = (month === 10); // november boolean // handle march and november (DST change months) if (mar || nov) { if (mar) { offset = 5; // assume EST to start adjust = -1; // DST adjustment to EDT } // handle offset shift to prior day if (hour - offset < 0) { date -= 1; day -= 1; } // handle date ranges when DST change may or may not have occurred yet if ((mar && date > 7 && date < 15) || (nov && date < 8)) { // DST adjustment on or after DST sunday at 2:00am if (date >= date - day && hour - offset >= 2) { offset += adjust; } // DST adjustment for dates after DST change has already occured } else if ((mar && date > 14) || (nov && date > 7)) { offset += adjust; // handle EDT to EST offset shift to prior day (not already handled above) if (nov && hour === 4) { date -= 1; day -= 1; } } // handle months without DST changes } else { // EDT to EST adjustment for EST months if (month < 2 || month > 10) { offset += adjust; } // handle offset shift to prior day if (hour < offset) { day -= 1; } } // get current timezone hour if (hour >= offset) { hour -= offset; } else { hour = hour - offset + 24; } // do something on weekdays between 8am and 6pm if (day > 0 && day < 6 && hour > 7 && hour < 19) { console.log('online'); // handle online // do something else on nights and weekends } else { console.log('offline'); // handle offline }