javascript - 如果用户当前的时区时间与“开放时间”(ES6)一致,则显示 div
问题描述
if (typeof(hoursoperation) != 'undefined' && hoursoperation != null)
{
console.log(myJson.acf['office_hours']);
}
在我的 Fetch API 技术中;我首先确保 ' office_hours
' 存在;确实如此:console.log
上面打印了以下数据:
Array(7)
0:
closing_time: "1600"
day: "7"
starting_time: "0800"
__proto__: Object
1:
closing_time: "1600"
day: "1"
starting_time: "0600"
__proto__: Object
2:
closing_time: "1600"
day: "2"
starting_time: "0600"
__proto__: Object
3: {day: "3", starting_time: "0600", closing_time: "1600"}
4: {day: "4", starting_time: "0600", closing_time: "1600"}
5: {day: "5", starting_time: "0600", closing_time: "1600"}
6: {day: "6", starting_time: "0700", closing_time: "1700"}
length: 7
__proto__: Array(0)
我怎样才能获得本地时间的用户;然后通过上面的迭代进行比较?
我知道使用 jQuery 是多么容易;但我一直坚持接近这是香草 ES6 javaScript 代码。
即这是我如何使用 jQuery 到达那里的:(但仍在寻找 ES6 方法)
var today, starttime, endtime;
var optiondata = JSON.parse(data);
var officehours = optiondata.acf.office_hours;
today = new Date();
var starthour = parseInt(parseInt(officehours[today.getDay()].starting_time)/100);
var startmin = starthour*100 - parseInt(officehours[today.getDay()].starting_time);
var endhour = parseInt(parseInt(officehours[today.getDay()].closing_time)/100);
var endmin = endhour*100 - parseInt(officehours[today.getDay()].closing_time);
starttime = new Date(today.getFullYear(),today.getMonth(),today.getDate(),starthour,startmin,0,0);
endtime = new Date(today.getFullYear(),today.getMonth(),today.getDate(),endhour,endmin,0,0);
// calculate offset for timezones (PST or PDT) to ensure that AlgaeCal is actually open (using Vancouver, B.C.)
var tzurl = "https://maps.googleapis.com/maps/api/timezone/json?location=49.246670,-123.094729×tamp=" + parseInt(today.getTime()/1000) + "&key=XXXXX";
$.ajax({
url: tzurl,
dataType: "text",
success:function(tzdata){
$("#hours-operation").hide();
var timezonedata = JSON.parse(tzdata);
// subtract offsets to get GMT of start and end times of office hours and convert to milliseconds:
var chkstarttime = starttime.getTime() - timezonedata.dstOffset*1000 - timezonedata.rawOffset*1000;
var chkendtime = endtime.getTime() - timezonedata.dstOffset*1000 - timezonedata.rawOffset*1000;
// get offset for current local time and convert to milliseconds
var tz = today.toString().split("GMT")[1].split(" (")[0];
var chktoday = today.getTime() - parseInt(tz)/100*60*60*1000;
// check if current time is truly during open office hours:
if(chktoday >= chkstarttime && chktoday <= chkendtime){
// show "speak to our bone health specialists message"
$("#hours-operation").show();
}
}
});
}
});
解决方案
首先,获取与办公时间相关的时区的当前时间。由于您的源数据使用HHMM
格式,因此也以该格式获取时间:
// This gives the current local time in Vancouver, in HHMM format, such as 1703 or 0945
const now = new Date().toLocaleTimeString('en-CA', {
timeZone: 'America/Vancouver', hour12: false, timeStyle: 'short'
}).replace(':','');
现在您可以简单地将值与源数据进行比较。HHMM
这是有效的,因为格式中的时间字符串是按字典顺序排序的。
const isActive = starting_time <= closing_time // test the shift type (normal or inverted)
? (starting_time <= now && closing_time > now) // normal comparison
: (starting_time <= now || closing_time > now); // inverted comparison
在上面的评论中,“正常”班次类型是在同一天开始和停止班次的类型,例如0900
to 1700
。“倒转”班次类型是跨越午夜的班次类型,例如1800
to 0200
。
请注意,这只适用于完全实现 ECMAScript 国际化 API 的环境,包括时区支持。
另请注意,它不考虑在夏令时回退过渡的模糊小时内开始或结束的班次。(完全围绕 DST 过渡的转变应该没问题。)
推荐阅读
- swagger - 将 OpenAPI 部署到本地主机
- ubuntu - Cmake外部共享库未在ubuntu上链接
- python - 为什么 [] 和 bool 返回 []?
- node.js - AWS::Lambda 无服务器调用本地函数不反映我的新 wcode
- php - 如何在同一查询中获取实体和计数?
- javafx - javafx SplitPane 分配器在内容/子项更改时跳转
- r - 如何使用两个日期之间的季度序列来旋转表格
- vue.js - Vuejs - 在'this'而不是self中观察嵌套对象
- python - Python 遗产
- ruby-on-rails - 在 Rails 上编码 mailer ruby 时出现问题