Places API を使えば、Google Map に登録されているデータを取得できます。
Places API は取得したいデータに応じて API が複数ありますが、Place Details で fields に opening_hours
を指定すれば、そのお店の開店・閉店時間を取得できます。
営業時間が次のお店なら、
- 日: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
- 月: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
- 火: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
- 水: 閉店
- 木: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
- 金: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
- 土: 11:30 AM – 2:00 PM, 5:00 PM – 3:00 AM
API で取得できるデータは次の通りです。なかなか複雑ですね!
{
"periods": [
{
"close": {
"day": 0,
"time": "1400"
},
"open": {
"day": 0,
"time": "1130"
}
},
{
"close": {
"day": 1,
"time": "0300"
},
"open": {
"day": 0,
"time": "1700"
}
},
{
"close": {
"day": 1,
"time": "1400"
},
"open": {
"day": 1,
"time": "1130"
}
},
{
"close": {
"day": 2,
"time": "0300"
},
"open": {
"day": 1,
"time": "1700"
}
},
{
"close": {
"day": 2,
"time": "1400"
},
"open": {
"day": 2,
"time": "1130"
}
},
{
"close": {
"day": 3,
"time": "0300"
},
"open": {
"day": 2,
"time": "1700"
}
},
{
"close": {
"day": 4,
"time": "1400"
},
"open": {
"day": 4,
"time": "1130"
}
},
{
"close": {
"day": 5,
"time": "0300"
},
"open": {
"day": 4,
"time": "1700"
}
},
{
"close": {
"day": 5,
"time": "1400"
},
"open": {
"day": 5,
"time": "1130"
}
},
{
"close": {
"day": 6,
"time": "0300"
},
"open": {
"day": 5,
"time": "1700"
}
},
{
"close": {
"day": 6,
"time": "1400"
},
"open": {
"day": 6,
"time": "1130"
}
},
{
"close": {
"day": 0,
"time": "0300"
},
"open": {
"day": 6,
"time": "1700"
}
}
]
}
このデータを使って、店舗が営業中かどうかを判定するアルゴリズムは次のようになります。
/**
* 営業中か判定する
* @param {Date} d 日付オブジェクト
* @param {object} openingHours 営業時間のデータ
* @return {boolean} 営業中なら true、閉店なら false
*/
const isOpen = (d, openingHours) => {
const day = d.getDay();
const h = String(d.getHours()).padStart(2, '0');
const m = String(d.getMinutes()).padStart(2, '0');
const time = h + m;
return openingHours.periods.filter(p => p.open.day === day || p.close.day === day).some(p => {
const s = p.open.time;
const t = p.close.time;
if (p.open.day === p.close.day) return s <= time && time <= t;
return (s <= time && time <= '2400') || ('0000' <= time && time <= t);
});
};
コーディング例を https://codepen.io/takatama/pen/vYOvEQP に置きました。