2016-12-29 78 views
0

正在做一個腳本,其中需要知道商店是打開還是關閉,取決於當地的時間。目前,我得到一個api的數據,我保存在我的數據庫中並通過Ajax請求調用它。返回的數據是(相等的,是我得到):創建一個函數來檢查商家是否開放

["Mo-Sa 11:00-14:30", "Mo-Th 17:00-21:30", "Fr-Sa 17:00-22:00"] 

我一直在評估其轉換以及的可能性(我還是要看看如何做到這一點):

{ 
    "monday": ["11:00-14:30", "17:00-21:30"], 
    "tuesday": ["11:00-14:30", "17:00-21:30"], 
    "wednesday": ["11:00-14:30", "17:00-21:30"], 
    "thursday": ["11:00-14:30", "17:00-21:30"], 
    "friday": ["11:00-14:30", "17:00-22:00"], 
    "saturday": ["11:00-14:30", "17:00-22:00"], 
    "sunday": null 
} 

我見過的例子在這些問題:

Create a function to check if a business is open and write text to html

Determine If Business Is Open/Closed Based On Business Hours(PHP)

在爲任何例程編寫代碼之前,我想知道是否有人知道任何方法使其變得簡單或在網絡上看到了一部分代碼;不要重新發明輪子。非常感謝。

問候

+0

那麼你嘗試過這麼遠嗎?我建議你至少在尋求幫助之前嘗試一些東西...... – NewToJS

+0

我會先不存儲像'Mo-Sa 11:00-14:30'這樣友好的數據,然後根據你的想法在白天存儲數據。這種友好的數據可以是僅顯示的,或者可能在用戶輸入時進行解析,但如果數據非常簡單地存儲在數據庫中,則對數據的任何查詢都會更容易。 –

回答

-1
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");  

問題/待辦事項(我不做所有的工作): 星期日至星期五不工作,for循環將失敗。 您需要以某種方式將今天的日期轉換爲公開參數。

+0

爲什麼downvote? –

0

隨着開放時間的推移,我更願意將所有數值轉換爲完整的分鐘數(hour*60 + minutes)。這樣比較容易與實際時間比較。

以分鐘爲起點,我將通過在每個工作日使用數組(與Date.getDay()返回的索引相同)進行有所不同的轉換,每天包含子數組,其開始的開始時間在分鐘(開始年底也子陣列,或一個對象)

const arr= ["Mo-Sa 11:00-14:30", "Mo-Th 17:00-21:30", "Fr-Sa 17:00-22:00"], 
 
\t days = ['Su','Mo','Tu','We', 'Th', 'Fr', 'Sa'], //start with sunday to be compatible with Date.getDay 
 
    times = Array.from(days, (d,i) => []), 
 
    getDay = (s,i) => days.indexOf(s.slice(i,i+2)), //helper function for parsing day name 
 
    getMinutes = s => s.split(':').reduce((m, n) => m * 60 + parseInt(n,10),0); //helper to store time in minutes of day 
 
    
 
//convert to new format 
 
for(let s of arr){ 
 
    let d = getDay(s,0), end = getDay(s,3); 
 
    while(true){  \t 
 
     times[d].push(s.slice(6).split('-').map(getMinutes)); 
 
     if(d===end)break; 
 
     d = ++d % 7; //the %7 makes it possible to have ranges as Th-Mo 
 
    } 
 
} 
 
    
 
//now times contains an array with a day in each index, containing subarrays of the opening times in minutes 
 
function isOpen(dt){ 
 
    let mins = dt.getHours() * 60 + dt.getMinutes(); 
 
    return times[dt.getDay()].some(a=>a[0] <= mins && a[1] >= mins) 
 
} 
 
    
 
    
 
//---------------------------------------------------------- 
 
//test functions only 
 
console.log('Is open now: ' , isOpen(new Date())); 
 
function test(dts){let dt = new Date(dts); console.log(days[dt.getDay()], dts,':', isOpen(dt));} 
 
test('2016/12/29 8:00'); //th 
 
test('2016/12/29 10:59'); 
 
test('2016/12/29 11:00'); 
 
test('2016/12/29 12:00'); 
 
test('2016/12/30 12:00'); //fr 
 
test('2017/1/1 12:00'); //su 
 
test('2016/12/29 21:45'); //th 
 
test('2016/12/30 21:45'); //fr

相關問題