各国 祝日 旅行の計画:祝日とイスラム暦(ヒジュラ暦)を踏まえる

旅行チームは、各市場の祝日、次の祝日、ヒジュラ暦を取得することで、祝日を踏まえた計画を立てられます。Narwhal は国と年ごとにそれらの日付を提供し、短いスクリプトで連休にまとめられます。

市場の次の祝日を調べる

予約チームは、市場が休みになる日や混雑する日を踏まえて計画します。Narwhal API には需要、予約、価格のデータはなく、提供するのは日付です。まず、ある日付以降の最初の祝日を返す next エンドポイントから始めます。このリクエストは 2026年11月3日以降のインドネシアを尋ね、national_public の scope だけを残します。

curl、インドネシアの次の祝日
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/calendars/holidays/IDN/next?from_date=2026-11-03&scope=national_public"
レスポンス
{
  "country": "IDN",
  "coverage": [
    {
      "scope": "national_public",
      "subdivision_codes": []
    }
  ],
  "holiday": {
    "date": "2026-12-25",
    "name": "Christmas Day",
    "holiday_key": "christmas_day",
    "local_name": "Kelahiran Yesus Kristus",
    "scope": "national_public",
    "subdivision_codes": []
  }
}

holiday オブジェクトには、date、英語の name、local_name、scope が入っています。coverage リストは、フィルターが残した scope を示します。scope フィルターを外すと、同じリクエストは代わりに 2026年12月24日のクリスマス集団休暇を返します。インドネシアは collective_leave の日も公表しているためです。

1年分を取得して連休を見つける

祝日が週末とつながると旅行の需要が高まります。年のエンドポイントは、ある国のすべての祝日を返し、短いスクリプトでそれを週末と結合して、4日以上連続する休みを見つけられます。このスクリプトは scope フィルターなしでインドネシアの 2026年を読むので、集団休暇の日も休みとして数えます。

python、祝日前後の連休
import json
import os
import urllib.request
from datetime import date, timedelta

def get(path):
    req = urllib.request.Request(
        "https://api.narwhalapi.com" + path,
        headers={"Authorization": "Bearer " + os.environ["NARWHAL_API_KEY"]},
    )
    with urllib.request.urlopen(req, timeout=30) as r:
        return json.load(r)

def long_breaks(country, year, min_days=4):
    names = {}
    for h in get(f"/v1/calendars/holidays/{country}/{year}")["holidays"]:
        names.setdefault(date.fromisoformat(h["date"]), []).append(h["name"])
    day, end, runs = date(year, 1, 1), date(year, 12, 31), []
    while day <= end:
        if day.weekday() >= 5 or day in names:
            start = day
            while day <= end and (day.weekday() >= 5 or day in names):
                day += timedelta(days=1)
            if (day - start).days >= min_days and any(d in names for d in
                    (start + timedelta(n) for n in range((day - start).days))):
                runs.append((start, day - timedelta(days=1)))
        else:
            day += timedelta(days=1)
    return runs, names

runs, names = long_breaks("IDN", 2026)
for first, last in runs:
    days = [first + timedelta(n) for n in range((last - first).days + 1)]
    print(first, last, len(days), "days:", "; ".join(dict.fromkeys(n for d in days for n in names.get(d, []))))

インドネシアの 2026年について、4つの連休が出力されます。

変換前変換後日数連休に含まれる祝日
2026-02-142026-02-174春節の集団休暇、春節
2026-03-182026-03-247Nyepi の集団休暇、Nyepi、Eid al-Fitr の集団休暇、Eid al-Fitr
2026-05-142026-05-174イエス・キリストの昇天、イエス・キリストの昇天の集団休暇
2026-12-242026-12-274クリスマスの集団休暇、クリスマス

国コードと年を変えれば、別の市場にも同じ確認ができます。このスクリプトでは週末を土曜と日曜としているので、週の稼働日が異なる国ではそのルールを変えてください。複数の市場を扱うチームは、国と年ごとに年のエンドポイントを1回ずつ呼び、国別の連休を1つの表にまとめます。

ムスリム人口の多い市場向けにヒジュラ暦を合わせる

これらの市場の祝日の多くはヒジュラ暦に従うため、グレゴリオ暦の日付は毎年動きます。Hijri エンドポイントはヒジュラ暦の年(AH)を受け取り、12か月と各月の初日を返します。対象はインドネシア、サウジアラビア、マレーシア、トルコ、エジプト、パキスタンです。AH 1447 は 2026年のラマダンを含み、このリクエストは第9月と第10月だけを残します。

curl、インドネシアのヒジュラ暦の月
curl -s -H "Authorization: Bearer $NARWHAL_API_KEY" \
  "https://api.narwhalapi.com/v1/calendars/hijri/IDN/1447"
レスポンス
{
  "country": "IDN",
  "year": 1447,
  "months": [
    {
      "month": 9,
      "calculated_start": "2026-02-18",
      "official_start": "2026-02-19",
      "status": "published",
      "source": "kemenag_table",
      "source_url": "https://aceh.kemenag.go.id/storage/berita_informasi/01K7GE96M0ZVRJ62Z520RMYG1B.pdf",
      "authority": "Kementerian Agama (Kemenag), Sidang Isbat for Ramadan, Shawwal and Dhu al-Hijjah",
      "announced_on": null,
      "decision_expected_on": "2026-02-17",
      "revised": false,
      "updated_at": "2026-11-02T16:31:12.025432Z"
    },
    {
      "month": 10,
      "calculated_start": "2026-03-20",
      "official_start": "2026-03-21",
      "status": "published",
      "source": "kemenag_table",
      "source_url": "https://aceh.kemenag.go.id/storage/berita_informasi/01K7GE96M0ZVRJ62Z520RMYG1B.pdf",
      "authority": "Kementerian Agama (Kemenag), Sidang Isbat for Ramadan, Shawwal and Dhu al-Hijjah",
      "announced_on": null,
      "decision_expected_on": "2026-03-18",
      "revised": false,
      "updated_at": "2026-11-02T16:31:12.279058Z"
    }
  ]
}

calculated_start は天文学的な計算による初日です。official_start は国の機関が定めた日で、定められるまでは null です。このレスポンスでは、ラマダンの開始は計算で 2026年2月18日、インドネシアの表では 2026年2月19日です。第10月は 2026年3月21日に始まり、これはインドネシアの祝日リストにある Eid al-Fitr の日付です。status は日付がどこまで確定しているかを示します。

グレゴリオ暦の1年は、ヒジュラ暦の2つの年にまたがります。インドネシアの表では AH 1448 が 2026年6月16日に始まるため、2026年全体を計画するには 1447 と 1448 の両方のレスポンスが必要です。

ヒジュラ暦の日付はどこまで確定していますか。

status を読みます。calculated は API が計算上の日付だけを持ち、official_start が null であることを意味します。published は公式の年間表があることを意味しますが、その表も変わる可能性があります。announced は、月の観測または isbat の会合を経た最終決定です。

AH 1447 について、サウジアラビアのレスポンスは第9月と第10月に calculated を返し、インドネシアとマレーシアは published を返します。calculated や published の Eid は計画用の日付として扱い、旅行が近づいたらもう一度確認してください。

API に学校の休暇はありますか。

いいえ。API に学校のカレンダーはありません。祝日の scope は national_public、regional_public、bank、federal_government、central_government、collective_leave、public_sector、private_sector で、どれも学期ではありません。祝日と連休の日付をカレンダー上の目安として使い、学校の日程は自分で用意した情報源から取ってください。

同じ祝日に属する行をまとめるには。

holiday_key を使います。インドネシアの 2026年のレスポンスでは、春節が 2月16日に集団休暇、2月17日に国民の祝日として現れ、どちらの行にもキー lunar_new_year が付いています。このキーでグループ化すれば祝日を1回として数えられ、各行の scope から、祝日そのものの日と前後の追加の日を区別できます。

集団休暇は旅行にとって何を意味しますか。

インドネシアは国民の祝日のほかに、集団休暇(cuti bersama)の日を collective_leave scope で掲載しています。祝日の隣に置かれ、休みを延ばします。そのため、上の表では 2026年3月21日の Eid al-Fitr が7日間の連休に入っています。

その日を除外するには scope=national_public を付けます。休み全体を見たいときは、上のスクリプトのようにフィルターを付けないでください。

公開。

次のステップ