when-am-i / commit
Add Roman (AUC) and Seleucid reckonings for Roman Judea — the time of Jesus
src/data/calendars/judea.json | 26 ++++++++++++++++++++++++++ src/utils/calendars.test.ts | 14 ++++++++++++++ src/utils/calendars.ts | 28 ++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/data/calendars/judea.json b/src/data/calendars/judea.json index 1e62646..35ddd42 100644 --- a/src/data/calendars/judea.json +++ b/src/data/calendars/judea.json @@ -31,6 +31,32 @@ "https://en.wikipedia.org/wiki/Gezer_calendar", "https://en.wikipedia.org/wiki/Ancient_Israel_and_Judah" ] + }, + { + "name": "Roman and Byzantine rule (Julian calendar)", + "start": "-0062-01-01", + "end": "0638-01-01", + "calendar": "ab urbe condita", + "usedBy": "the Roman administration and the wider empire", + "description": "From Pompey's conquest of Jerusalem in 63 BC, Judea came under Roman rule — a client kingdom under Herod, then a Roman province from AD 6 — and later Byzantine rule, until the Muslim conquest of the Levant around AD 638. The empire's months followed the Julian calendar (the familiar January–December), introduced by Julius Caesar in 45 BC. Years, though, were not numbered the way we number them now: Romans dated by the year's two consuls or an emperor's regnal year, with ab urbe condita — counting from Rome's legendary founding in 753 BC — as a count used mostly by later historians, so what we call AD 1 would be AUC 754. The Anno Domini (AD) system did not exist yet: it was devised only around AD 525 by the monk Dionysius Exiguus and spread centuries later, so no one alive here would have called any year \"1 AD\".", + "sources": [ + "https://en.wikipedia.org/wiki/Ab_urbe_condita", + "https://en.wikipedia.org/wiki/Julian_calendar", + "https://en.wikipedia.org/wiki/Anno_Domini", + "https://en.wikipedia.org/wiki/Judea_(Roman_province)" + ] + }, + { + "name": "Seleucid era (Era of Contracts)", + "start": "-0199-01-01", + "end": "0638-01-01", + "calendar": "Seleucid era", + "usedBy": "Hellenistic communities and Jews", + "description": "After the Battle of Panium (200 BC) Judea passed from Ptolemaic to Seleucid control, and the Seleucid era — counting from 312/311 BC — became a common reckoning across the Hellenistic Near East. Jews adopted it as the \"Era of Contracts\" (minyan shtarot): it dates events in 1 Maccabees and, following Talmudic instruction, was kept in diaspora legal deeds for centuries afterward — among Yemenite Jews into modern times. Around the turn of the era a local using it would count roughly the Seleucid year 312 for what we now call AD 1. The end date here bounds it to its span as a common civil reckoning in the region (to the Muslim conquest, ~AD 638); its use in Jewish legal documents lingered well beyond.", + "sources": [ + "https://en.wikipedia.org/wiki/Seleucid_era", + "https://en.wikipedia.org/wiki/Seleucid_Empire" + ] } ] } diff --git a/src/utils/calendars.test.ts b/src/utils/calendars.test.ts index 5a39cca..2e1486e 100644 --- a/src/utils/calendars.test.ts +++ b/src/utils/calendars.test.ts @@ -152,6 +152,20 @@ describe('convert', () => { expect(convert({ year: 1912, month: 1, day: 1 }, 'Juche').localYearLabel).toBe('Juche 1'); }); + it('converts to the ab urbe condita (AUC) year (hand-rolled offset)', () => { + // Rome founded 753 BC, so AD 1 = AUC 754 and 1 BC (astronomical year 0) = AUC 753. + expect(convert({ year: 1, month: 1, day: 1 }, 'ab urbe condita').localYearLabel).toBe('AUC 754'); + expect(convert({ year: 0, month: 1, day: 1 }, 'AUC').localYearLabel).toBe('AUC 753'); + expect(convert({ year: 1, month: 1, day: 1 }, 'ab urbe condita').convertible).toBe(true); + }); + + it('converts to the Seleucid era (Anno Graecorum) year (hand-rolled offset)', () => { + // Epoch 312/311 BC, so AD 1 ≈ SE 312 (conventional +311 mapping). + expect(convert({ year: 1, month: 1, day: 1 }, 'Seleucid era').localYearLabel).toBe('SE 312'); + expect(convert({ year: 1, month: 1, day: 1 }, 'Anno Graecorum').system).toBe('Seleucid era (Anno Graecorum)'); + expect(convert({ year: 1, month: 1, day: 1 }, 'Seleucid era').convertible).toBe(true); + }); + it('names the Aztec/Mexica year-bearer (descriptive-only)', () => { // 1519 CE is documented as "1 Ācatl" (Cortés's arrival). const c = convert({ year: 1519, month: 6, day: 1 }, 'Aztec/Mexica year-bearer'); diff --git a/src/utils/calendars.ts b/src/utils/calendars.ts index 1027811..d099432 100644 --- a/src/utils/calendars.ts +++ b/src/utils/calendars.ts @@ -371,6 +371,30 @@ function jucheConverter(date: HistoricalDate): CalendarConversion { }; } +// ── Ab urbe condita and the Seleucid era (hand-rolled, arithmetic offset) ──── +// Two ancient year counts that map to the astronomical year by a fixed offset, +// like Dangi/Juche above. Ab urbe condita counts from Rome's legendary founding +// in 753 BC (AD 1 = AUC 754); the Seleucid era from 312/311 BC (AD 1 ≈ SE 312). +// Both are year-only — the day and month followed other calendars (the Julian +// calendar in the Roman world; lunisolar reckonings in the Seleucid Near East). +function abUrbeConditaConverter(date: HistoricalDate): CalendarConversion { + return { + system: 'Ab urbe condita (AUC)', + localYearLabel: `AUC ${date.year + 753}`, + convertible: true, + note: 'A year count from the legendary founding of Rome (753 BC). In daily life Romans more often named the year by its two consuls or an emperor’s regnal year; only the year is computed here, not the Julian month and day.', + }; +} + +function seleucidEraConverter(date: HistoricalDate): CalendarConversion { + return { + system: 'Seleucid era (Anno Graecorum)', + localYearLabel: `SE ${date.year + 311}`, + convertible: true, + note: 'A year count from the Seleucid epoch (312/311 BC), used across the Hellenistic Near East and by Jews as the “Era of Contracts” (minyan shtarot). Its year began in autumn (Babylonian/Jewish reckoning) or spring (Macedonian), so near the turn of the year the count can differ by one; only the year is computed.', + }; +} + const CONVERTERS: Record<string, Converter> = { gregorian: (date) => ({ system: 'Gregorian', @@ -399,6 +423,10 @@ const CONVERTERS: Record<string, Converter> = { 'juche': jucheConverter, 'aztec/mexica year-bearer': aztecYearBearerConverter, 'aztec year-bearer': aztecYearBearerConverter, + 'ab urbe condita': abUrbeConditaConverter, + 'auc': abUrbeConditaConverter, + 'seleucid era': seleucidEraConverter, + 'anno graecorum': seleucidEraConverter, }; for (const { names, def } of TEMPORAL_CALENDARS) {