Ascension Day date calculator
Ascension Day moves each year because its date is tied to Easter Sunday rather than to a fixed day of the Gregorian calendar.
Run — free
This calculator accepts a year, determines Gregorian Easter with a deterministic computus, and advances exactly thirty-nine calendar days to the following Thursday. The response includes the final date, its month and day, and the Easter date used as the calculation anchor. It uses no current clock, timezone, network service, or regional calendar setting, so the same valid input always produces the same result.
Why Ascension Day changes from year to year
Ascension Day is a movable Christian observance whose calendar position follows Easter. In the traditional count, Easter Sunday is day one of the Easter season and Ascension is observed on the fortieth day. Expressed as ordinary date arithmetic, that places Ascension Day thirty-nine days after Easter Sunday, always on a Thursday. Since Gregorian Easter can occur from late March through late April, Ascension can occur from late April through early June. This calculator starts with the requested Gregorian year and applies the established Gregorian computus to find Easter Sunday. It then advances through the actual lengths of the intervening calendar months. The calculation does not infer a date from a locale, a church calendar setting, or a stored table. That distinction matters when dates are generated for schedules, publications, or software: a clearly defined Gregorian rule is reproducible, inspectable, and independent of where the request runs. The returned Easter date lets you verify the anchor instead of receiving an unexplained holiday date.
How to read and verify the result
Enter one whole-number Gregorian year from 1 through 9999. The primary result is the Ascension Day date in the unambiguous YYYY-MM-DD format. Separate year, month, and day fields make the answer convenient for templates or structured workflows, while the month name provides a readable label. The response also identifies Thursday as the weekday and reports that the date is thirty-nine days after the accompanying Easter Sunday date. A simple manual check is to take the returned Easter date and count forward five complete weeks, which accounts for thirty-five days, then add four more days. Sunday plus that interval lands on Thursday. The algorithm uses integer arithmetic throughout and never constructs a JavaScript Date object, so local midnight rules, daylight-saving transitions, host timezone settings, and historical timezone databases cannot shift the result. The supported range is deliberately explicit. Inputs that are missing, fractional, nonnumeric, or outside the declared year range are rejected instead of being rounded or silently reinterpreted.
Using the date in calendars and operations
The result is useful wherever a movable observance must be planned before a calendar is finalized. A school, parish, publisher, travel team, or payroll administrator can calculate the date for one year and place it into its own policy-aware schedule. The API form is equally suitable for generating annual calendars, validating imported holiday data, or testing a date library against a stable reference calculation. Keep in mind that this capability answers one precise question: the traditional Thursday date of Ascension Day under the Gregorian Easter calculation. In some places, observance may be transferred to the following Sunday by local ecclesiastical practice, and civil holiday treatment varies by jurisdiction. Those policy choices are intentionally not guessed here. If your workflow needs the transferred Sunday, add three days to this result only after confirming that the relevant authority uses that rule. The request price is $0.002; the browser calculation uses the same pure logic. No submitted year or calculated date needs an external service to produce the answer.
What you can do with it
Prepare an annual church calendar
Generate the traditional Thursday date from the year and retain the Easter anchor for review.
Validate holiday schedule data
Compare a supplied Ascension Day entry with a deterministic Gregorian calculation before publishing it.
Automate future planning
Insert the movable observance into yearly planning tools without depending on a holiday API or timezone database.
FAQ
How is Ascension Day calculated?
The calculator finds Gregorian Easter Sunday for the requested year and advances exactly 39 calendar days, producing a Thursday.
Why is the interval 39 days rather than 40?
Traditional liturgical counting includes Easter Sunday as the first day. In elapsed date arithmetic, the fortieth day is therefore 39 days after Easter.
Does the calculation depend on my timezone?
No. It uses pure integer calendar arithmetic and does not use a clock, Date object, timezone, or locale setting.
Does this return the transferred Sunday observance?
No. It returns the traditional Thursday. Some jurisdictions transfer observance to the following Sunday, which is a local policy decision.
What does an API request cost?
Each API request costs $0.002. The browser version runs the same deterministic calculation locally.
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/ascension-day \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"year":2026}'const res = await fetch("https://api.kit.forhosting.com/date/ascension-day", {
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/ascension-day",
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/ascension-day", 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/ascension-day", 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.ascension_day",
"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. |