Javascript 创建一个函数来检查业务是否打开

Javascript 创建一个函数来检查业务是否打开,javascript,date,datetime,Javascript,Date,Datetime,我正在做一个脚本,其中需要知道商店是打开还是关闭,这取决于本地时间。目前,我获取了一个api的数据,我将其保存在数据库中,并通过Ajax请求调用它。返回的数据(等于我得到的数据): 我一直在评估转换它的可能性(我还需要看看如何转换): 我在这些问题中看到了一些例子: (菲律宾) 在使用任何例程编写代码之前,我想知道是否有人知道如何简化它,或者是否在web上看到过部分代码;不要重新发明轮子。非常感谢 致意 var dates=yourdateobj; //its easier to work w

我正在做一个脚本,其中需要知道商店是打开还是关闭,这取决于本地时间。目前,我获取了一个api的数据,我将其保存在数据库中,并通过Ajax请求调用它。返回的数据(等于我得到的数据):

我一直在评估转换它的可能性(我还需要看看如何转换):

我在这些问题中看到了一些例子:

(菲律宾)

在使用任何例程编写代码之前,我想知道是否有人知道如何简化它,或者是否在web上看到过部分代码;不要重新发明轮子。非常感谢

致意

var dates=yourdateobj;
//its easier to work with numbers then string for example (1-3 is easier then mo-wed)
var daytoindex={"Mo":1,"Tu":2,"Wed":3,"Thu":4,"Fr":5,"Sat":6,"Sun":7};
//the better structured table: 
var destructdates=[];
//for each old timestring:
dates.forEach((e,i)=>{
  //destructure timestring
  e=e.split(" ");
  var days=e[0].split("-");
  var hours=e[1];
  //add time to all days inbetween (1-3 (Mo-Wed) is 1,2,3 (Mo,Tue;Wed)
  for(var i=daytoindex[days[0]];i<=daytoindex[days[1]];i++){
    //the day is an array,add the open hours
    destructdates[i]=destructdates[i]||[];
    destructdates[i].push(hours);
  }
});
现在您可以执行以下操作:

function open(day,hour,second){
//get the todays times Array
var dayhours=destructdates[daytoindex[day]];
 //if now falls into one of the times:   
return dayhours.some((e,i)=>{

   //destructure the times:
   e=e.split("-");
   var start=e[0].split(":");
   var starthour= +start[0];
   var startminute= +start[1];
   var end=e[1].split(":");
   var endhour= +end[0];
   var endminute= +end[1];

   //check:
   if(starthour<=hour && startminute<=minute && endhour>=hour &&endminute>=minute){
     return true;
    }
return false;
});
}
问题/待办事项(我不做你所有的工作): 星期天星期五不行,for循环将失败。
您需要以某种方式将今天的日期转换为开放参数

对于开放时间,我更喜欢将所有值转换为完整分钟(
hour*60+分钟
)。这样就更容易与实际时间进行比较

以分钟为起点,我将通过在每个工作日使用数组(使用与
Date.getDay()
返回的索引相同的索引)来进行一些不同的转换,每天包含子数组,打开的开始和结束时间以分钟为单位(开始和结束也在子数组中,或在对象中)

const arr=[“Mo Sa 11:00-14:30”,“Mo Th 17:00-21:30”,“Fr Sa 17:00-22:00”],
days=['Su'、'Mo'、'Tu'、'We'、'Th'、'Fr'、'Sa'],//从星期日开始与Date.getDay兼容
时间=数组。从(天,(d,i)=>[]),开始,
getDay=(s,i)=>days.indexOf(s.slice(i,i+2)),//用于解析日期名称的帮助函数
getMinutes=s=>s.split(':').reduce((m,n)=>m*60+parseInt(n,10),0)//助手以分钟为单位存储时间
//转换为新格式
对于(让我们来讨论arr){
设d=getDay(s,0),end=getDay(s,3);
虽然(正确){
时间[d].push(s.slice(6).split('-').map(getMinutes));
如果(d==结束)中断;
d=++d%7;//通过%7可以将范围设置为Th Mo
}
}
//现在times包含一个数组,每个索引中有一天,包含以分钟为单位的开放时间子数组
函数等参元(dt){
设mins=dt.getHours()*60+dt.getMinutes();
返回时间[dt.getDay()].some(a=>a[0]=min)
}
//----------------------------------------------------------
//仅测试功能
log('Is open now:',isOpen(new Date());
函数测试(dts){let dt=new Date(dts);console.log(days[dt.getDay()],dts',:',isOpen(dt));}
测试('2016/12/29 8:00')//th
测试('2016/12/29 10:59');
测试('2016/12/29 11:00');
测试('2016/12/29 12:00');
测试('2016/12/30 12:00')//fr
测试('2017/1/1 12:00')//苏
测试('2016/12/29 21:45')//th

测试('2016/12/30 21:45')//fr
到目前为止,您尝试了什么?我建议你在寻求帮助之前至少尝试一下……我会先不存储那些看起来友好的数据,比如
mosa 11:00-14:30
,然后按照你的想法按天存储数据。外观友好的数据只能显示,如果用户输入数据,则可能会对其进行解析,但如果数据存储在数据库中非常简单,则对数据的任何查询都会容易得多。
var dates=yourdateobj;
//its easier to work with numbers then string for example (1-3 is easier then mo-wed)
var daytoindex={"Mo":1,"Tu":2,"Wed":3,"Thu":4,"Fr":5,"Sat":6,"Sun":7};
//the better structured table: 
var destructdates=[];
//for each old timestring:
dates.forEach((e,i)=>{
  //destructure timestring
  e=e.split(" ");
  var days=e[0].split("-");
  var hours=e[1];
  //add time to all days inbetween (1-3 (Mo-Wed) is 1,2,3 (Mo,Tue;Wed)
  for(var i=daytoindex[days[0]];i<=daytoindex[days[1]];i++){
    //the day is an array,add the open hours
    destructdates[i]=destructdates[i]||[];
    destructdates[i].push(hours);
  }
});
destructdates:
[
1:["12:33-15:44","12:33-0:30"] //Mo
2:...
]
function open(day,hour,second){
//get the todays times Array
var dayhours=destructdates[daytoindex[day]];
 //if now falls into one of the times:   
return dayhours.some((e,i)=>{

   //destructure the times:
   e=e.split("-");
   var start=e[0].split(":");
   var starthour= +start[0];
   var startminute= +start[1];
   var end=e[1].split(":");
   var endhour= +end[0];
   var endminute= +end[1];

   //check:
   if(starthour<=hour && startminute<=minute && endhour>=hour &&endminute>=minute){
     return true;
    }
return false;
});
}
alert(open("Tu",12,33)?"Open":"Close");