Calendar quarter finder
15 May 2024 falls in Q2, the quarter that runs from 1 April to 30 June 2024. Enter any date to get its calendar quarter, the first and last day of that block and the three months it covers. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Date
- 2024-05-15
- Year
- 2,024
- Month
- 5
- Day
- 15
- Quarter
- 2
A calendar quarter is one of the four fixed three-month blocks that divide a civil year: Q1 runs from the first of January through the thirty-first of March, Q2 from the first of April through the thirtieth of June, Q3 from the first of July through the thirtieth of September, and Q4 from the first of October through the thirty-first of December. Finance teams, product roadmaps, school calendars, and compliance reports constantly ask which quarter a given day falls in and what the inclusive start and end dates of that block are. This finder accepts a single ISO calendar date in the strict form year-month-day with four digits, two digits, and two digits, checks that the day really exists on the Gregorian calendar including leap-year Februaries, maps the month to quarter number one through four, and returns the quarter label, the quarter start ISO date, the quarter end ISO date, and the three months that belong to that quarter. Impossible dates such as the twenty-ninth of February in a common year or the thirty-first of April fail with a clear validation error instead of a silent wrap.
How calendar quarters map from an ISO date
Start with a calendar date written as year, month, and day in the international ISO form with hyphens and fixed widths so that every client agrees on the same three integers. First confirm that the year lies in a practical Gregorian range from year one through nine thousand nine hundred ninety-nine and that the month is between one and twelve.
Next apply the leap-year rule used by civil calendars worldwide: a year is a leap year when it is divisible by four, except that century years are leap years only when they are also divisible by four hundred. That rule makes February twenty-nine legal in years such as two thousand twenty-four and two thousand, and illegal in two thousand twenty-three and nineteen hundred.
With leap status known, look up the length of each month for that year and reject any day that exceeds the month length, for example the thirty-first of April or the thirtieth of February.
When the triple is valid, convert the month into a quarter with a simple integer map: months one through three are quarter one, four through six are quarter two, seven through nine are quarter three, and ten through twelve are quarter four, which is the same as taking the floor of month minus one divided by three and then adding one.
The start and end of each quarter are fixed civil bounds for that year: the first of January through the thirty-first of March, the first of April through the thirtieth of June, the first of July through the thirtieth of September, and the first of October through the thirty-first of December. Leap years never change those quarter end dates because February is never the last month of a quarter.
Where calendar quarter finders show up in real work
Finance and accounting teams label invoices, bookings, and board packs by calendar quarter so annual reports roll up without ambiguous month-only keys. Product managers schedule roadmap milestones and OKRs against Q1 through Q4 and need the inclusive start and end dates when building filters or reminder windows. Data warehouses partition fact tables by quarter and must stamp every source row with a stable quarter number derived from a civil ISO date rather than a host-local clock.
Compliance calendars and school terms often publish deadlines as the last day of a quarter; validators need both the quarter of a given day and the quarter end date for range checks. If you later need fiscal-year quarters with a custom year start month, day-of-year ordinals, business-day counts between two dates, or ISO week numbers, treat those as separate search intents and landings rather than overloading this calendar quarter finder page.
FAQ
What are the calendar quarters?
Q1 is January 1–March 31, Q2 is April 1–June 30, Q3 is July 1–September 30, and Q4 is October 1–December 31. Bounds are civil calendar dates for the same year as the input.
Does leap year change quarter end dates?
No. February is never the last month of a quarter, so Q1 still ends on March 31 in leap and common years. Leap rules only affect whether February 29 is a valid input date.
What date format is required?
Strict ISO YYYY-MM-DD with four-digit year and two-digit month and day. Values like 2024-5-15 or 2024/05/15 are rejected so every client agrees on the same string.
What happens with an invalid date such as 2023-02-29?
The error message explains that the day is not valid for that year and month.
What does it cost?
The browser tool is free and runs locally.
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/quarter-of-year \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2024-05-15"}'const res = await fetch("https://api.kit.forhosting.com/date/quarter-of-year", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "2024-05-15"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/quarter-of-year",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "2024-05-15"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/quarter-of-year", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"2024-05-15"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"2024-05-15"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/quarter-of-year", 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": "2024-05-15"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.quarter_of_year",
"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
What you send and what you get back
Send one required string field named date containing a strict ISO calendar day such as two thousand twenty-four hyphen zero five hyphen fifteen. Days that match the pattern but are not real calendar dates, including non-leap February twenty-nine and month values outside one through twelve, also fail with a message that names the problem so clients can correct the input without guessing. Classic checks include the fifteenth of May mapping to Q2 with bounds April first through June thirtieth, the first of January mapping to Q1, the thirty-first of December mapping to Q4, and quarter boundaries themselves landing on the correct block without sliding into the next. Missing fields, non-string values, and strings that do not match the four-two-two digit pattern fail with invalid_input and are not charged. On success the response echoes the normalized date string, the numeric year, month, and day components, quarter as an integer from one through four, quarter_label as the familiar Q1 through Q4 string, quarter_start and quarter_end as inclusive ISO dates for that civil block, months_in_quarter as an array of three month numbers, a boolean is_leap_year flag, and a short formula string that documents the month-to-quarter rule. Pricing for successful API calls is the published base of $0.002 per item; validation failures do not consume prepaid balance.
Where calendar quarter finders show up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Finance and board reporting
Map each booking or invoice ISO date to Q1–Q4 with quarter_start and quarter_end so quarterly rollups and filters stay consistent across tools.
Roadmaps and OKR windows
Stamp milestones with quarter_label and inclusive bounds so dashboards can filter “current quarter” without host time zones.
Warehouse partitions and batch labels
Derive a stable quarter number from strict YYYY-MM-DD inputs for partition keys, with clear invalid_input on impossible calendar days.