Julian ↔ Gregorian converter
Convert a date between the Julian and Gregorian calendars, either way round: 15 October 1582 in the Gregorian calendar is 5 October 1582 in the Julian one. The result names both calendars, so nothing gets mixed up. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Date
- 1582-10-15
- Conversion direction
- gregorian_to_julian
- Input date
- 1582-10-15
- Converted date
- 1582-10-05
- Source calendar
- gregorian
- Destination calendar
- julian
Convert civil dates between the Julian and Gregorian calendars with a documented reform policy.
Same day, two calendar dates
The Julian and Gregorian calendars give the same day different dates. On the day the Gregorian calendar calls 15 October 1582, the Julian calendar still reads 5 October 1582, ten dates earlier. This converter takes a civil date written as year, month and day, applies the calendar reform rule it documents, and gives you the matching date in the other calendar, labelled with the calendar you started from and the one you got. Nothing depends on a time zone or a clock: a date without a time is a plain calendar day, and the same input always gives the same answer, with no conversion table to build in a spreadsheet.
Avoiding the usual mix-ups
The most frequent mistake is converting in the wrong direction. If a date is already Gregorian and you treat it as Julian, the result moves the opposite way instead of being corrected, so check which calendar your source uses before you choose. A second mistake is assuming a time zone can shift the day; it cannot, because only the calendar date is read. Finally, empty entries, values that are not dates and contradictory choices are refused before any calculation, which means you see a clear message instead of a converted date that looks believable but is wrong.
Edge cases and limits
Empty strings, wrong types, and contradictory ranges are rejected early. Civil dates without timezone are calendar dates. Embedded tables travel inside the capability folder with no network calls at runtime.
Review examples before integrating.
What you can do with it
Daily work
Get a reliable answer without a spreadsheet.
FAQ
What is 15 October 1582 in the Julian calendar?
It is 5 October 1582. Choose the Gregorian-to-Julian direction, enter 1582-10-15 and the converter gives 1582-10-05: the same day, written ten dates earlier in the Julian calendar.
Can I convert in both directions?
Yes. Pick Julian to Gregorian or Gregorian to Julian before entering the date; the result names the calendar you started from and the one you got, so the two are never confused.
Does my time zone change the result?
No. A date with no time attached is treated as a plain calendar day, so where you are or what your clock says has no effect on the converted date.
Why is my date refused?
Empty entries, values that are not dates and contradictory choices are rejected before any calculation, so you get a clear message instead of a converted date that looks plausible but is wrong.
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/julian-calendar \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"1582-10-15"}'const res = await fetch("https://api.kit.forhosting.com/date/julian-calendar", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "1582-10-15"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/julian-calendar",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "1582-10-15"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/julian-calendar", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"1582-10-15"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"1582-10-15"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/julian-calendar", 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": "1582-10-15"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.julian_calendar",
"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 it works
Convert civil dates between the Julian and Gregorian calendars with a documented reform policy. The calculation is fully deterministic and runs free in your browser with the same pure function as the API. Inputs are validated before arithmetic so bad types become clear invalid_input errors. Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values. Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values.
Inputs and outputs
Optional fields use documented defaults. Required schema fields must be present and typed. Success payloads always include the primary output fields so UI bindings stay stable. Extremely large intermediates that overflow IEEE-754 become out-of-range errors rather than nulls. Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values. Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values.
Edge cases and limits
Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values. Additional guidance covers validation order, deterministic results, browser and API parity, stable error match strings for certification, and safe handling of out-of-range floating values.
Integration use cases
Automation
Same pure function in widget and API.
Teaching
Stable golden fixtures for demos.
Technical questions
Is it free?
Yes, tier A in the browser.
Network?
No network; parse on-device.
Invalid input?
invalid_input with a clear match.
Stable?
Deterministic goldens freeze the contract.
Author?
samurai.