Dragon Boat Festival date
In 2026 the Dragon Boat Festival falls on 19 June. Enter any year from 2020 to 2035 and get the civil date of Duanwu, the fifth day of the fifth lunar month, ready for travel, event or school planning. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Year
- 2,026
- Month
- 6
- Day
- 19
- ISO date
- 2026-06-19
- Festival
- dragon_boat_duanwu
Civil date of Dragon Boat / Duanwu for 2020–2035 from a fixed table. Search intent: dragon boat festival date. No network calls or random seeds are required. Failed jobs are not billed.
A celebration set by the lunar calendar
The Dragon Boat Festival, called Duanwu in Chinese, falls on the fifth day of the fifth month of the lunar calendar. Because lunar months do not line up with the months of the Gregorian calendar, the festival lands on a different civil date each year, and in 2026 it is 19 June. Anyone planning travel, events, school calendars or shop opening hours around the festival needs that civil date rather than the lunar one, and it is easy to get it wrong by assuming last year's date still applies.
How the date is found, and its limits
Instead of estimating moon phases, the calculator looks up the civil date in a fixed table that covers every year from 2020 to 2035. You enter a whole year and get the month and day of the festival, along with the full date. Years outside that range are not covered, so the tool never guesses a date it cannot confirm from the table. Inside the range, the same year always returns the same date, which makes it safe to copy into a calendar or a plan.
How it works
Civil date of Dragon Boat / Duanwu for 2020–2035 from a fixed table. 5th day of 5th lunar month → tabulated Gregorian date. No network calls or random seeds are required. Failed jobs are not billed.
When to use it
Use when search intent matches. Civil date of Dragon Boat / Duanwu for 2020–2035 from a fixed table. No network calls or random seeds are required.
Failed jobs are not billed.
What you can do with it
Teaching
Pinned goldens.
FAQ
When is the Dragon Boat Festival in 2026?
It falls on 19 June 2026. That is the civil date of the fifth day of the fifth lunar month, the traditional day of Duanwu, in that year.
Why does the festival move to a different date every year?
Because it follows the lunar calendar, not the Gregorian one. The festival is always on the fifth day of the fifth lunar month, and that day corresponds to a different civil date each year.
Which years can I look up?
Any year from 2020 to 2035. The dates come from a fixed table for that period, so a year outside the range is turned away rather than given an estimated date.
Is Duanwu the same as the Dragon Boat Festival?
Yes. Duanwu is the Chinese name of the celebration known in English as the Dragon Boat Festival, so both names point to the same day and the same date in the table.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/date/dragon-boat-festival \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"year":2026}'const res = await fetch("https://api.kit.forhosting.com/date/dragon-boat-festival", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"year": 2026
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/dragon-boat-festival",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"year": 2026
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/dragon-boat-festival", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"year":2026}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"year":2026}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/dragon-boat-festival", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"year": 2026
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.dragon_boat_festival",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
How it works
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
Inputs, limits and rounding
Optional decimals use half-up once. Optional output fields are omitted, never null. No network calls or random seeds are required. Failed jobs are not billed. Provide required JSON fields with DOM-safe names. Invalid types raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
When to use it
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested.
Integration use cases
Quick check
Free widget.
Automation
API same JSON.
Technical questions
Free?
Yes tier A.
Network?
No.
Bad input?
invalid_input.
API?
Yes.
Locales?
8 locales.