Start and end of decade
13 August 2026 sits in the decade from 2020 to 2029, which opens on 1 January 2020 and closes on 31 December 2029. Enter any calendar date and get both boundary years and dates, inclusive at each end. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Date
- 2026-08-13
- Year
- 2,026
- Decade start year
- 2,020
- Decade end year
- 2,029
- Decade start date
- 2020-01-01
Find the exact boundaries of the decade containing a date without consulting today’s date, a local timezone, or an external calendar service. Supply one explicit ISO calendar date in YYYY-MM-DD form and receive the normalized input, its year, the decade’s first and last years, and the inclusive boundary dates from January 1 of the opening year through December 31 of the closing year. The calculation follows year-number decades such as 2020 through 2029 and is entirely determined by the value you send. Strict validation rejects malformed strings and impossible calendar days instead of silently correcting them.
How the decade boundaries are defined
This calculator uses the common year-number definition of a decade: ten consecutive calendar years beginning with a year whose final digit is zero and ending with a year whose final digit is nine. Under that convention, every date from 2020-01-01 through 2029-12-31 belongs to the 2020–2029 decade. The first year is found by dividing the input year by ten, discarding the remainder, and multiplying by ten; the last year is nine greater.
The returned start date is always January 1 of the first year, while the returned end date is always December 31 of the last year. Both boundaries are inclusive. This definition is deliberately explicit because some historical discussions number decades from years ending in one through years ending in zero.
The capability does not attempt to choose between conventions from context: its contract always uses zero-through-nine blocks. It treats the submitted value as a proleptic Gregorian calendar date in UTC, so country-specific calendar adoption dates, fiscal decades, academic cycles, and local midnight offsets do not alter the answer. No current date is inferred, and the result never changes as time passes.
Input validation and deterministic output
Send date as a string with exactly four year digits, two month digits, and two day digits separated by hyphens. Leading and trailing whitespace is removed, but embedded times, timezone offsets, slashes, month names, shortened years, and natural-language phrases are not accepted. The parser verifies that the month is between 01 and 12 and that the day actually exists in that month.
February 29 is accepted only when the year follows the Gregorian leap-year rule: divisible by four, except century years that are not divisible by four hundred. This prevents values such as 2023-02-29, 2026-04-31, and 2026-13-01 from producing misleading boundaries. The year range is 0000 through 9999, and year 0000 participates in the 0000–0009 block under ISO astronomical year numbering.
Every output field comes from integer arithmetic and fixed formatting.
Using decade dates in reports and automation
Decade boundaries are useful wherever a single event date must be assigned to a stable ten-year reporting window. An analytics pipeline can enrich records with inclusive start and end dates before grouping cohorts, building filters, or joining against a period table. Editorial teams can label timelines consistently without hand-maintained lookup lists, while compliance and retention systems can calculate the named window first and then apply their own policy offsets separately.
The explicit ISO output also avoids ambiguity between a textual label such as “the twenties” and the exact dates an application should compare. Keep fiscal periods, rolling ten-year windows, and century calculations separate because they answer different questions. Since the calculation depends only on the submitted date, teams can store its result in audit records, regenerate it later, and compare outputs byte for byte in continuous integration without worrying about timezone changes, daylight-saving rules, or a moving definition of “this decade.”
What you can do with it
Archive records by decade
Convert each document date into exact inclusive decade boundaries for predictable folders, indexes, and retrieval filters.
Enrich analytics events
Attach first and last decade years and ISO dates to event rows before cohort grouping or warehouse joins.
Build historical timelines
Turn dated milestones into consistent zero-through-nine decade windows without maintaining a manual boundary table.
FAQ
Which years make up the decade for 2026?
The capability uses zero-through-nine decades, so 2026 belongs to 2020–2029, beginning 2020-01-01 and ending 2029-12-31.
Are the start and end dates inclusive?
Yes. January 1 of the first year and December 31 of the last year both belong to the returned decade.
Does the calculation use the current date or my timezone?
No. It uses only the explicit ISO calendar date you submit and applies deterministic proleptic Gregorian arithmetic in UTC.
Why does the decade start in a year ending in 0 and not 1?
The calculator always uses blocks from a year ending in zero to a year ending in nine, the common way people name decades. Some historians count from years ending in one instead, but that convention is never applied here.
Which dates are rejected?
Any day that does not exist, such as 31 April 2026, month 13 or 29 February 2023, is refused instead of corrected. Times, time zone offsets, slashes, month names and shortened years are not accepted either.
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/decade-start-end \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2026-08-13"}'const res = await fetch("https://api.kit.forhosting.com/date/decade-start-end", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "2026-08-13"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/decade-start-end",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "2026-08-13"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/decade-start-end", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"2026-08-13"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"2026-08-13"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/decade-start-end", 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-08-13"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.decade_start_end",
"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
Input validation and deterministic output
A successful result returns date, year, decade_start_year, decade_end_year, decade_start_date, and decade_end_date. The implementation never calls the JavaScript Date constructor, reads the system clock, looks up a timezone, accesses the network, or uses randomness, so the same request produces an identical JSON result in the browser, API, tests, and offline workflows.
Using decade dates in reports and automation
An archive can turn a document date into folder keys such as decade_start_year and decade_end_year. For range queries, test whether another calendar date is greater than or equal to decade_start_date and less than or equal to decade_end_date. Interactive use on this page is free; a successful API request costs $0.002 per item.
Technical questions
What inputs are rejected?
Missing values, non-string values, non-YYYY-MM-DD formats, invalid months, and impossible days such as 2023-02-29 are rejected with invalid_input.
What does it cost?
The browser tool is free. A successful API calculation costs $0.002 per item.