Roman Kalends/Nones/Ides
1 March 2020 is the Kalends of March in the Roman calendar, written Kalendis. Enter a modern date to see how it is named in classical Roman style, counted from the Kalends, Nones and Ides of its month. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Date
- 2020-03-01
- Conversion direction
- gregorian_to_roman
- Roman date form
- kalendae
- Day
- 1
- Month
- 3
Convert Gregorian civil dates into classical Roman calendar notation (Kalends, Nones, Ides).
Three marker days in every month
The Romans did not number the days of a month from first to last as we do. Instead, each month had three fixed marker days. The Kalends was always the first day. The Nones came on the fifth, except in March, May, July and October, when it moved to the seventh. The Ides fell on the thirteenth, or on the fifteenth in those same four months. Every other day was described by how far it lay before the next of these markers. This converter takes a modern date and tells you which marker it is or which marker it leads up to.
Reading the result without slips
Roman counting was inclusive: both the day itself and the marker day were counted, so the number of days before a marker looks one higher than a modern subtraction would suggest. Days after the Ides are named after the Kalends of the next month, which means a late-March date is written in relation to April. Enter the date as year, month and day; an empty entry or one in the wrong format is rejected before any calculation. The result is worked out the same way every time, with nothing looked up online, so you get a reliable answer without a spreadsheet.
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 are the Kalends, Nones and Ides?
They are the three fixed marker days of every Roman month. The Kalends is the first day, the Nones falls on the fifth or seventh, and the Ides on the thirteenth or fifteenth.
In which months do the Nones and Ides fall later?
In March, May, July and October the Nones fall on the seventh and the Ides on the fifteenth. In every other month they fall on the fifth and the thirteenth.
How are the other days of the month named?
They are counted backwards to the next marker day, so a date is named as a number of days before the Nones, the Ides or the Kalends of the following month.
Can it turn a Roman date back into a modern one?
No. It works one way only, so you enter a modern date and get its Roman name. To go the other way, read the result as the number of days before the marker day it names.
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/roman-date \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"date":"2020-03-01"}'const res = await fetch("https://api.kit.forhosting.com/date/roman-date", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"date": "2020-03-01"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/roman-date",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"date": "2020-03-01"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/roman-date", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"date":"2020-03-01"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"date":"2020-03-01"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/roman-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": "2020-03-01"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.roman_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 it works
Convert Gregorian civil dates into classical Roman calendar notation (Kalends, Nones, Ides). 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.