Groundhog Day date and weekday calculator by year
Groundhog Day always occurs on February 2, but the weekday changes from year to year.
Run — free
This calculator accepts a Gregorian calendar year and returns the complete ISO date, the English weekday name, and useful numeric weekday values. Its result comes from fixed calendar arithmetic rather than the computer clock, a time zone, or an online service. That makes it suitable for a quick personal lookup as well as repeatable software, publishing, event planning, and historical calendar workflows.
Enter the year you want to check
Provide one whole Gregorian calendar year between 1 and 9999. The calculator fixes the month and day as February 2 because Groundhog Day has the same calendar date every year, then determines which weekday contains that date. For example, entering a year is enough; you do not need to supply a location, time, or time zone. The result includes an ISO-formatted date with a four-digit year, the weekday written in English, an ISO weekday number where Monday is 1 and Sunday is 7, and a Sunday-origin number where Sunday is 0. Those explicit fields make the response easy to display or pass into another program. Text containing only digits is accepted by the underlying solver for compatibility with forms, while missing values, fractions, signs, words, and years outside the supported range are rejected. The calculation answers the calendar question only. It does not predict what a groundhog will see, report weather, or claim whether winter will continue.
How the weekday is calculated deterministically
The weekday is computed with integer Gregorian calendar arithmetic equivalent to Sakamoto's algorithm. February uses a fixed month offset, and the selected year is adjusted because January and February are treated as part of the previous arithmetic year. The calculation then accounts for ordinary four-year leap cycles, removes century years that are not leap years, and restores centuries divisible by 400. A final remainder produces a number from 0 through 6, which maps from Sunday through Saturday. The ISO weekday value is derived from the same remainder, so Monday becomes 1 and Sunday becomes 7. No JavaScript Date object is created. That matters because Date-based code can accidentally inherit a machine's local time zone, interpret early years inconsistently, or cross a day boundary when a UTC value is formatted locally. This implementation has no clock, network request, random value, locale-dependent parser, or mutable state. Identical validated input therefore produces identical JSON in the API worker and the free browser runner.
Use the result in calendars, content, and automation
The response is designed to serve both people and software. A content editor can verify the weekday before publishing an annual Groundhog Day article. A school or museum can label an activity schedule without manually paging through a calendar. An events application can use the ISO date as a stable key and the weekday name as display text, while analytical code can group results with either numeric weekday convention. Because the occasion always falls on February 2, the calculation is intentionally narrow and transparent: it does not add observance rules, substitute a weekday, or move the date when February 2 lands on a weekend. It also does not calculate regional festivals with similar names. For automated use, each request represents one year and costs $0.002; the browser version can be used interactively without an API request. Validate and store the returned ISO date rather than reconstructing it from prose, and choose the ISO weekday field when interoperating with systems that follow the Monday-through-Sunday international numbering convention.
What you can do with it
Plan an annual event
Check which weekday February 2 falls on before choosing staffing, opening hours, or adjacent weekend activities.
Prepare seasonal content
Insert the correct date and weekday into an article, newsletter, classroom worksheet, or social media calendar.
Populate calendar software
Use the stable ISO date and numeric weekday fields in scheduling, reporting, or archival data pipelines.
FAQ
What date is Groundhog Day?
Groundhog Day is always February 2. The year determines the weekday returned by this calculator.
Does Groundhog Day move when it falls on a weekend?
No. This capability always returns February 2 and does not apply substitute-day or observed-holiday rules.
How is the weekday determined?
It uses deterministic proleptic Gregorian integer arithmetic, including the calendar's leap-year and century rules.
Does the calculation use my time zone?
No. It uses calendar fields deterministically in UTC terms and never reads a local clock, time zone, or Date object.
What does an API request cost?
One year is one item and costs $0.002 per API request. The browser calculator is available for interactive use.
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/groundhog-day \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"year":2026}'const res = await fetch("https://api.kit.forhosting.com/date/groundhog-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/groundhog-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/groundhog-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/groundhog-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.groundhog_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.
Limits
year_min | 1 |
year_max | 9999 |
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. |