旅行アプリ開発記録⑤ 各スポットの営業時間判定

に公開

旅行アプリでは、地味に営業時間判定をしています。
深夜からの出発とかだと、観光スポットとかレストランが営業時間外であることが多く、それを紹介しても行けないので必要と判断しました。


営業時間判定の流れ


判定ロジックのポイント

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