Get the day of the week from a date
25 July 2026 falls on a Saturday, ISO weekday 6. Type any real date up to the year 9999 and get its weekday, checked against the full Gregorian leap-year rule and independent of time zones. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Date
- 2026-07-25
- Day of week
- Saturday
- Iso weekday number
- 6
- Zeller index
- 0
Enter a calendar date in YYYY-MM-DD form to find the weekday on which it falls. This calculator first checks that the date is a real day in the Gregorian calendar, including the complete leap-year rule, and then applies Zeller's congruence with deterministic integer arithmetic. The result includes the English weekday name, its ISO number from Monday 1 through Sunday 7, and the original Zeller index. It is useful for historical checks, schedules, software tests, and any workflow that needs a weekday without relying on a system clock or time zone.
Enter an exact and valid calendar date
Provide the date in the exact YYYY-MM-DD format, using four digits for the year and two digits each for the month and day. For example, 2026-07-25 is accepted, while 25/07/2026, July 25, 2026, and 2026-7-25 are rejected. A strict format removes ambiguity between day-first and month-first conventions and makes automated requests predictable.
Format alone is not enough: the calculator also checks the actual Gregorian calendar. Months must be numbered from 01 through 12, the day must fit the selected month, and February 29 is allowed only in a leap year. The leap-year rule includes its century exceptions: years divisible by 100 are normally common years, but years divisible by 400 remain leap years.
Consequently, 2000-02-29 is valid while 1900-02-29 is invalid. Supported years run from 0001 through 9999. Invalid input produces an explicit input error instead of a guessed, normalized, or silently shifted answer.
How Zeller's congruence finds the weekday
Zeller's congruence converts a date into a weekday by combining the day of the month, a transformed month number, the year within its century, and the zero-based century. January and February are treated as months 13 and 14 of the preceding year, which lets leap-day placement fit one consistent formula. For the Gregorian calendar, the calculation adds the day, the floored month term, the year of the century, and two floored division terms, then subtracts twice the century.
The final value is reduced modulo seven. This implementation uses a positive modulo operation so the result is stable even when the intermediate sum is negative for early years. Zeller's original numbering assigns zero to Saturday, one to Sunday, two to Monday, and so on through six for Friday.
What you can do with it
Check a historical or personal date
Find the weekday for a birthday, anniversary, milestone, or Gregorian archival date without consulting a calendar table.
Validate schedules and business rules
Confirm whether a supplied date lands on a weekday or weekend before applying downstream scheduling logic.
FAQ
Which date format is required?
Use exactly YYYY-MM-DD, with a four-digit year and two-digit month and day.
Does the calculator reject impossible dates?
Yes. It rejects invalid months, days outside a month's range, and February 29 in a non-leap year.
How are leap years handled?
A year divisible by 4 is a leap year unless divisible by 100, except that years divisible by 400 are leap years.
What does the ISO weekday number mean?
It uses Monday as 1, Tuesday as 2, and so on through Sunday as 7.
Does time zone affect the answer?
No. The input is a calendar date without a time or zone, and the calculation uses only integer arithmetic.
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/calc2/day-of-week-from-date \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2026-07-25"}'const res = await fetch("https://api.kit.forhosting.com/calc2/day-of-week-from-date", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "2026-07-25"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/calc2/day-of-week-from-date",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "2026-07-25"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/calc2/day-of-week-from-date", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"2026-07-25"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"2026-07-25"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/calc2/day-of-week-from-date", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"date": "2026-07-25"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "calc2.day_of_week_from_date",
"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
How Zeller's congruence finds the weekday
The response exposes that value as zeller_index and also converts it into the familiar weekday name. It additionally returns an ISO weekday number, where Monday is 1 and Sunday is 7. Every operation is deterministic integer arithmetic; the calculator does not consult the system clock, infer a time zone, call the JavaScript Date API, use network data, or depend on locale settings.
Use the result reliably in applications
The date field repeats the validated input so batched callers can associate each answer with its request. This capability treats every value as a Gregorian calendar date rather than a timestamp. There is no hour, offset, daylight-saving transition, locale, or geographic conversion, so a date cannot unexpectedly move to the previous or next day. The response keeps three related representations so different applications can use the one that fits. day_of_week is the complete English name and works well in reports, messages, and human review. iso_weekday_number is best for sorting, business rules, and integrations because its Monday-through-Sunday scale follows ISO convention. zeller_index preserves the direct formula result and is useful when teaching the method, auditing a calculation, or comparing another implementation of Zeller's congruence. API use costs $0.002 per request. If you process multiple dates, submit and retain each result independently, and treat an invalid_input response as a data-quality issue to correct rather than retrying unchanged input.
Integration use cases
Create deterministic test fixtures
Generate weekday names and ISO weekday numbers for software tests without system-clock or time-zone dependencies.
Technical questions
What does an API request cost?
Each API request costs $0.002.