根据计划的GMT更改显示文本

时间:2018-07-21 01:07:26

标签: javascript date datetime time

通常情况下,我已经做了一些工作才能到达需要帮助的地方,但是我对此完全感到困惑。

使用普通的ol JavaScript,我需要根据元素的文本是否在以下任何小时/天组合中落入来进行更改:

M-F 5:00 AM-9:00 PM Pacific Time
Sa-Su 5:00 AM-5:30 PM Pacific Time

如果访问该网站的人处于同一时区,我知道该怎么做,但是我不知道该怎么做以确保每个人都可以看到正确的东西,而不管他们所在的时区如何。

2 个答案:

答案 0 :(得分:1)

太平洋标准时间为UTC-0800,但是在所有使用PST的地方也都采用夏令时,因此仅转换为PST可能不够。

无论如何,正如kfedorov91所建议的那样,您可以将PST时间转换为UTC以创建合适的Date对象,然后与之比较。请注意,太平洋标准时间21:00是第二天的05:00 UTC,但这并不是真正的问题。您可以将开始时间设置为13:00 UTC,然后在周一至周五增加16小时,在周六和周日增加12.5小时。

要获取正确的开始日期(如果该时间早于UTC 08:00),请将UTC日期更改为前一天,并将时间更改为05:00。然后根据是工作日还是工作日结束,通过添加开放时间来设置结束时间。

// M-F   05:00 - 21:00 PST -> 13:00 - 05:00 UTC
// Sa-Su 05:00 - 17:30 PST -> 13:00 - 01:30 UTC

function getRange(date) {
  // Start is 1300 UTC every day
  var start = new Date(date);
  // If before 0800 UTC, set to previous day
  if (start.getUTCHours() < 8) {
    start.setDate(start.getDate() - 1);
  }
  start.setUTCHours(13,0,0,0);
  // Set end to +16 or +12.5 hours if weekend
  var end = new Date(start);

  if (end.getDay() % 6) {
    end.setHours(end.getHours() + 16);
  } else {
    end.setHours(end.getHours() + 12, 30);
  }
  
  return [start, end];
}

function isInRange(date) {
  date = date || new Date();
  var range = getRange(date);
  return date >= range[0] && date <= range[1];
}

// Helper to get current time PST (UTC-0800)
function getPSTTime(date) {
  date = date || new Date();
  function z(n){return (n<10?'0':'')+n}
  var d = new Date(date);
  d.setUTCHours(d.getUTCHours()-8);
  
  return 'Sun Mon Tue Wed Thu Fri Sat'.split(' ' )[d.getUTCDay()] + ' ' + z(d.getUTCHours()) + ':' + z(d.getUTCMinutes());
}

// Is the current time in range?
var d = new Date();
console.log('PST Time: ' + getPSTTime());
console.log('Is it in range? ' + (isInRange(d)? 'yes':'no'));

答案 1 :(得分:0)

最简单的方法是将您的小时数转换为UTC时间,然后使用JS Date的UTC函数。 UTC比现在的太平洋时间早7个小时,所以您的UTC时间为:

M-F 12:00 PM - 4:00 AM UTC
Sa-Su 12:00 PM - 12:30 AM UTC

然后知道您可以做到:

function isItWorkingHours(date = null) {
  date = date ? date : new Date();
  const utcDay = date.getUTCDay();
  const utcHour = date.getUTCHours();
  const utcMinute = date.getUTCMinutes();
  
  if (utcHour >= 12) { // any day after noon
    return true;
  } else if (
    utcHour === 0 && // between 12 AM & 1 AM
    utcMinute <= 30 && // before 12:30 AM
    utcDay <= 1 // on sunday or monday
    ) {
    return true;
  } else if (
    utcHour <= 4 && // before 4AM
    utcDay >= 2 && // on or after Tuesday
    utcDay <= 7 // on or before Saturday
    ) {
    return true;  
  } else {
    return false;
  }
}

console.log(isItWorkingHours());

当然,这有点令人困惑,并且由于太平洋时间进入和退出夏令时而UTC忽略了它,因此您将不得不对其进行一些更新。如果您愿意加入第三方的依赖关系,那么绝对应该考虑使用Moment.js