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.
| Parameter | Value | Description |
|---|---|---|
| Epoch date | 2026-06-22 00:00:00 UTC | Notional UTC epoch |
| Epoch offset | 44193.792289 UT1 sec | Earliest nightfall → UT1 seconds of day |
| True epoch start | 2026-06-22 ≈12:16:33 UT1 | ITS day 0 instant |
| ITS day | 86400 SI seconds | Counted in UT1 |
| ITS year | 147 days (7 months) | |
| ITS month | 21 days | Numbered 0–6 |
| ITS week | 7 days | 3 weeks per month, 21 weeks per year |
| Time resolution | 1 nanosecond | Signed 64-bit or arbitrary-precision |
| DUT1 data | IERS finals.all | Natural cubic spline interpolation |
| Latitude | 55.03° N | Novosibirsk, Russia |
| Longitude | 82.93° E | Novosibirsk, Russia |
| Twilight angle | 108° (astronomical) | Sun center below −108° |
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.
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.
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.
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).
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)
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
"{years}y {months}m {days_rem}d {HH}:{MM}:{SS}"
| Constant | Value |
|---|---|
| EPOCH_UNIX | 1782086400.0 |
| OFFSET | 44193.792289 |
| ITS_DAY_NS | 86400000000000 |
| ITS_YEAR_DAYS | 147 |
| ITS_MONTH_DAYS | 21 |
| LAT | 55.03 |
| LON | 82.93 |
| ZENITH | 108.0 |
| Endpoint | Method | Response |
|---|---|---|
/api/its_nsecs |
GET | {"nsecs":"<integer string>"} |
The server serves static files from the static/ directory at the root /.