首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据远程时区和日期显示div

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

Stack Overflow用户
提问于 2018-09-13 04:37:44
回答 3查看 671关注 0票数 1

我正在尝试根据东部时区(NYC)显示周一至周五上午8点到下午6点之间显示的在线聊天div,如果离线则不显示任何内容,以便来自北京的客户将根据这些时间在线或离线查看。

只需显示()或隐藏() div即可。到目前为止,我有小时数,但我不确定如何使它们与用户时区相关。

代码语言:javascript
复制
$(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();
    }
});
EN

回答 3

Stack Overflow用户

发布于 2018-09-13 05:01:11

之前的答案(seen in edit history)是使用UTC的偏移量,但是,如果您想支持夏令时,这将不是一个选项;这是一件重要的事情。

因此,对先前建议的修改完全删除了UTC的使用。为了支持夏令时,从EST获取时间的唯一正确方法是将地区设置为该位置,读取时间,设置一个新的date对象(从技术上讲,该对象将在客户端本地设置,但我们真正想要的是来自Date对象的日期和小时响应,因此我们将忽略该技术细节)。

这是通过使用toLocaleString调用传递一个指定时区的对象,然后使用该结果构造一个新日期来完成的。

代码语言:javascript
复制
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();
}
代码语言:javascript
复制
.online { 
  display: none;
  color: green;
}
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="online">Online</div>

票数 0
EN

Stack Overflow用户

发布于 2018-09-13 06:41:24

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

假设您的HTML是由某种服务器端语言(PHP、Ruby等)生成的,将程序设置为使用纽约时间,并简单地计算您是否处于“打开”时间内。如果你是打开的,生成聊天div。如果你关门了。别。

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

票数 0
EN

Stack Overflow用户

发布于 2018-09-13 14:19:28

事实证明,使用JavaScript并不是一项完全微不足道的任务(正如在@StephenR的回答中所指出的,这可能更容易处理服务器端)。正如在一些评论中所指出的,使用库可能是更好的js方法。

也就是说,在思考了@RobG关于浏览器对toLocaleStringtimeZone等选项的不同支持的评论后,我很好奇用另一种方式来解决这个问题(这让我对各种js日期库心存感激)。下面的代码片段...

代码语言:javascript
复制
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
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52303123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档