ITS — Specifications

Overview

The ITS time system defines a custom time scale anchored to the Earth's rotation (UT1) and an astronomical event: the earliest nightfall in Novosibirsk, Russia (latitude 55.03° N, longitude 82.93° E).

The zero point is not an arbitrary UTC midnight — it is the earliest astronomical twilight end (Sun altitude < −108°) observed in Novosibirsk over the 50-year window 1976–2026. The UT1 second-of-day of that event is stored in offset.dat (44193.792289 sec ≈ 12:16:33 UT1).

ITS time is a signed integer of nanoseconds elapsed since that instant. It uses UT1 (Universal Time), which tracks the actual rotation of the Earth. The difference UT1−UTC (DUT1) is obtained from the IERS finals.all file and interpolated with a natural cubic spline to arbitrary timestamps.


Specifications Table

ParameterValueDescription
Epoch date2026-06-22 00:00:00 UTCNotional UTC epoch
Epoch offset44193.792289 UT1 secEarliest nightfall → UT1 seconds of day
True epoch start2026-06-22 ≈12:16:33 UT1ITS day 0 instant
ITS day86400 SI secondsCounted in UT1
ITS year147 days (7 months) 
ITS month21 daysNumbered 0–6
ITS week7 days3 weeks per month, 21 weeks per year
Time resolution1 nanosecondSigned 64-bit or arbitrary-precision
DUT1 dataIERS finals.allNatural cubic spline interpolation
Latitude55.03° NNovosibirsk, Russia
Longitude82.93° ENovosibirsk, Russia
Twilight angle108° (astronomical)Sun center below −108°

Calendar System

The calendar is purely derived from the nanosecond delta using floor division:

days       = nsecs / 86400_000_000_000
rem_ns     = nsecs % 86400_000_000_000
seconds    = rem_ns / 1e9    → HH:MM:SS

years      = days / 147
r          = days % 147
months     = r / 21
days_rem   = r % 21

Years, months, days, and hours are numbered from 0.


DUT1 and UT1

The Earth's rotation is irregular. UTC uses leap seconds to stay within ±0.9 s of UT1, but ITS tracks UT1 directly. DUT1 = UT1 − UTC is obtained from the IERS bulletin B (finals.all). A natural cubic spline is fitted to daily MJD/DUT1 pairs to interpolate DUT1 at arbitrary timestamps with sub-millisecond accuracy.


How to Implement Your Own

1. Get DUT1

Download finals.all from IERS data center. Columns 8–15 contain Modified Julian Date (MJD), columns 58–67 contain DUT1 (fractional seconds, may be negative). Build a natural cubic spline through the (MJD, DUT1) points.

2. Get the epoch offset

The epoch offset is 44193.792289 UT1 seconds of day. This is the UT1 second at which the earliest astronomical nightfall occurs on the epoch date. You can hardcode this value or compute it with the solar algorithm (see common.c).

3. Calculate the nanosecond delta

epoch_dut1 = interpolate_dut1_spline(mjd_from_unix(EPOCH_UNIX))     // 1782086400
now_dut1   = interpolate_dut1_spline(mjd_from_unix(current_unix_ts))

epoch_start_sec = EPOCH_UNIX + epoch_dut1 + OFFSET     // OFFSET = 44193.792289
now_ut1_sec     = current_unix_ts + now_dut1 + current_nsec / 1e9
delta_sec       = now_ut1_sec - epoch_start_sec
delta_ns        = floor(delta_sec * 1e9 + 0.5)

// Equivalent MJD helper:
// mjd_from_unix(t) = 40587 + floor(t / 86400)

4. Parse into calendar

day_ns  = 86400_000_000_000
days    = delta_ns / day_ns
rem_ns  = delta_ns % day_ns
// floor division: if days < 0 && rem_ns != 0: days--, rem_ns += day_ns

sec     = rem_ns / 1e9
hours   = floor(sec / 3600)
minutes = floor((sec % 3600) / 60)
seconds = floor(sec % 60)

year_days = 147
month_days = 21
years     = days / year_days
r         = days % year_days
// floor: if years < 0 && r != 0: years--, r += year_days
months    = r / month_days
day_rem   = r % month_days

5. Format

"{years}y {months}m {days_rem}d {HH}:{MM}:{SS}"

6. Key constants

ConstantValue
EPOCH_UNIX1782086400.0
OFFSET44193.792289
ITS_DAY_NS86400000000000
ITS_YEAR_DAYS147
ITS_MONTH_DAYS21
LAT55.03
LON82.93
ZENITH108.0

API Reference

EndpointMethodResponse
/api/its_nsecs GET {"nsecs":"<integer string>"}

The server serves static files from the static/ directory at the root /.