⌚
旅行アプリ開発記録⑤ 各スポットの営業時間判定
旅行アプリでは、地味に営業時間判定をしています。
深夜からの出発とかだと、観光スポットとかレストランが営業時間外であることが多く、それを紹介しても行けないので必要と判断しました。
営業時間判定の流れ
判定ロジックのポイント
1. 深夜特別ルール
- 判定対象時間が 21時以降または5時前 の場合、特定の業態(コンビニ・牛丼チェーンなど)は営業時間判定をスキップして許可してます。実際行ける店はこれらくらいなので。。。
- 「快活CLUB」や「マクドナルド」「山岡家」など、実際に深夜営業が多い店舗名もキーワードで判定。
2. 屋外施設は営業時間外でも許可
- 公園や神社、展望台などの屋外観光スポットは、営業時間が閉店後でも夜間利用を許可してます。じゃないと行く場所ないので。。。
- GoogleMap APIのdetailでtypesや名称に「公園」「神社」「展望」などが含まれている場合に適用。
3. 24時間営業の判定
- 営業時間に「24時間営業」「Open 24 hours」などの文字が含まれていれば即許可。
- 一部の飲食店やコンビニはこれに該当。
4. 通常営業時間との重なり判定
- 現在時刻と滞在予定時間が営業時間と重なっているかを判定。
- 深夜0時をまたぐケースに対応するため、閉店時間が開店時間より早い場合は翌日まで延長して判定。
実装例(一例)
def is_spot_available(spot, current_time, end_time):
# 深夜特別ルール
if current_time.hour >= 21 or current_time.hour < 5:
if "convenience_store" in spot.get("types", []) or any(name in spot["name"] for name in ["すき家", "吉野家"...]):
return True
# 屋外施設判定
outdoor_keywords = ["公園", "神社", "寺", "展望", "広場"...]
if any(keyword in spot["name"] for keyword in outdoor_keywords):
return True
# 24時間営業
if any("24時間" in h or "Open 24 hours" in h for h in spot.get("Business_hours", [])):
return True
# 営業時間重なり判定(深夜0時跨ぎ対応)
for hours in spot["Business_hours"]:
if " - " in hours:
open_time, close_time = parse_hours(hours)
if close_time <= open_time:
close_time += timedelta(days=1)
if max(current_time, open_time) < min(end_time, close_time):
return True
return False
まとめ
- 深夜特例、屋外施設、24時間営業の考慮 により、現実的な判定を入れてます。
- 観光スポットでは営業時間情報が不明でも、適切に許可できる設計。
Discussion