DraftResearch specification · version 0.1.0-draft · subject to change
One instant. Two integers. A named time scale.
UTP is a draft protocol for writing an instant down exactly: whole SI seconds and 100‑picosecond ticks counted from 2000-01-01 12:00:00 Terrestrial Time, with one canonical spelling and integer arithmetic specified to the last tick. Local clocks and calendar dates are computed from that instant for display, never written into it.
833630400:1234567890 UTPAnatomy of a timecode
1833630400:21234567890 3UTP- 1 · seconds
Whole SI seconds since J2000.0, noon on 2000-01-01 TT. A signed 64-bit integer: negative before the epoch, about ±292 billion years of range.
- 2 · ticks
Always ten digits,
0000000000to9999999999. One tick is exactly 10⁻¹⁰ s, or 100 ps. Here, 0.1234567890 s into the second. - 3 · protocol marker
UTPmarks a UTP timestamp, whose count is on Terrestrial Time (TT = TAI + 32.184 s): atomic, continuous, with no leap seconds and no zone offset. It names the format, not a new time scale.
- Decimal seconds since J2000.0
- 833630400.1234567890 s
- TT calendar label
- 2026-06-02 00:00:00.123456789 TT
- UTC label
- 2026-06-01 23:58:50.939456789 UTC
The value of a timecode is exactly seconds + ticks / 10¹⁰. It is a representation, not a measurement: how well any clock knows the time is a separate question.
Why a new encoding
Most timestamp formats leave something implicit: the time scale, the zone, how many fractional digits mean what, or what happens when arithmetic runs off the end. UTP's case is that all of those can be fixed in the contract, so that two independent implementations reading the same string reach the same instant and the same arithmetic result.
The scale is part of the format
Every UTP timestamp counts TT, and its marker says which contract applies. There is no local offset to guess and no discontinuity to skip: one second of count is one SI second.
J2000.0 0:0000000000 UTP in UTC 11:58:55.816
Exact integers on a fixed grid
Representable instants on the 100 ps grid are held exactly by a pair of integers; conversions from floating-point inputs such as Julian Date or POSIX time round to the nearest tick, ties to even. Normalization carries and borrows with floor division, and a result outside the 64-bit range is an error, never a wrap, clamp, or saturation.
normalize(100, −1) → (99, 9999999999) normalize(0, −25000000000) → (−3, 5000000000)
One canonical spelling
The emitter always writes the ten-digit suffix form. The parser accepts that and the documented prefix form, nothing looser: a shortened tick field could be read as left- or right-padded, so it is rejected rather than guessed.
accepted 0:5000000000 UTP rejected 0:5 UTP
Decimal precision you can project
Because a tick is a power of ten, reducing to seconds, milliseconds, microseconds or nanoseconds is a decimal shift with half-to-even rounding and a stated error bound. The canonical value is never replaced by its projection.
full 0.2500000000 ms 0.250
Order and storage that behave
Sorting by
(seconds, ticks)is chronological. Both fields fit 64-bit integer columns; 32-bit types are ruled out because ticks reach past 2³².CHECK (utime_ticks BETWEEN 0 AND 9999999999)
Agreement you can test
The draft includes language-neutral test vectors for formatting, parsing, normalization and projection, derived from the specification rather than from any one implementation. Cross-language conformance is the goal, and still work in progress. The marker spelling shown here is proposed; reference parsers and test vectors have not yet migrated.
(833630400, 1234567890) → "833630400:1234567890 UTP"
Strict parsing, by example
| Input and result | Why |
|---|---|
0:5000000000 UTPAccepted | Half a second after J2000.0. |
UTP:0:5000000000Accepted | The same instant in the alternate prefix form. |
-1:5000000000 UTPAccepted | Half a second before J2000.0: seconds are floored, ticks never negative. |
0:5 UTPRejected | Is that 0.5 ns or 0.5 s? Short tick fields are ambiguous across nine orders of magnitude. |
01:0000000000 UTPRejected | Leading zero. The grammar admits one spelling of each seconds value. |
0:0000000000 utpRejected | The protocol marker is case-sensitive. |
0:10000000000 UTPRejected | Eleven digits. A full second of ticks must be normalized to 1:0000000000 first. |
Store the instant, render the clock
UTP separates what is stored from how it is shown. The stored value is a single count; each civil label is derived from it with whatever rules that view needs.
The core protocol represents universal instants. True Local Time is a separate, related proposal for longitude-based local clocks without time zones or seasonal clock changes; this draft does not specify or implement it, though a later version might. Calendar design is separate work too. The zone labels below only show that today's civil rules can still be applied as views.
833630400:1234567890 UTPFull precision. The single source of truth for exchange and arithmetic.
- 2026-06-02 00:00:00.123456789 TTFixed rule: J2000.0 plus the count.
- 2026-06-01 23:58:50.939456789 UTCNeeds the TAI − UTC offset in force on that date (37 s).
- 2026-06-01 18:58:50.939 CDTChicago under today's zone and daylight-saving rules, shown for compatibility.
- 2026-06-02 08:58:50.939 JSTTokyo under today's zone rules: same instant, different civil label.
- 833630400.123An application log at the ms tier: lossy, and labelled as such.
Resolution, not accuracy
A tick is the smallest step the encoding can name. In one tick, light travels 2.99792458 cm. That says nothing about how well a given clock knows the time: an internet-synchronized computer is typically good to milliseconds. UTP lets each consumer project to the precision it actually has.
- 1 s10⁰
- 10⁻¹
- 10⁻²
- ms10⁻³
- 10⁻⁴
- 10⁻⁵
- µs10⁻⁶
- 10⁻⁷
- 10⁻⁸
- ns10⁻⁹
- tick10⁻¹⁰
| Tier | Digits | Projected value | Max error |
|---|---|---|---|
s | 0 | 833630400 | ½ s |
ms | 3 | 833630400.123 | ½ ms |
µs | 6 | 833630400.123457 | ½ µs |
ns | 9 | 833630400.123456789 | ½ ns |
full | 10 | 833630400.1234567890 | none (identity) |
Projections are for display and downstream consumers. Only the full tier round-trips exactly; arithmetic belongs on the canonical pair.
Time scales and conversions
The draft specifies how a UTP timestamp relates to the scales people already use. Some relations are constant and exact. UTC is not: its offset from atomic time has changed over the decades, so every conversion depends on the date.
| Scale | Relation | Exactness |
|---|---|---|
| TT | The stored count itself | Underlying scale of every UTP timestamp |
| TAI | TT − 32.184 s | Constant offset; exact in ticks |
| GPS time | Seconds since 1980-01-06 = UTP seconds + 630 763 148.816 s | Constant offset; exact in ticks |
| UTC | TT − 32.184 s − (TAI − UTC for that date) | The offset is exact in ticks where the published leap-second table covers the date. A UTC label printed to nanoseconds drops the last tick digit. |
| POSIX time | The UTC calendar label, counting every day as 86 400 s | Instants inside a leap second map to the following midnight. Near present-day dates a double-precision POSIX value is spaced about 0.24 µs apart, far coarser than one tick. |
| TT Julian Date | Out: a two-part (jd1, jd2) pair of doubles. In: the two parts are summed exactly. | Out: the day fraction is correctly rounded. In: the sum is rounded to the nearest tick, ties to even. |
Historical conversions
From 1972, the offset between TT and UTC is known exactly from the published TAI − UTC table. Before 1972, UTC used fractional steps and any value is model-dependent; before 1960, UTC did not exist.
Example: TAI − UTC was 32 s at the epoch, so J2000.0 is 2000-01-01 11:58:55.816 UTC. Using today's 37 s would put it five seconds early.
Prospective conversions
Beyond the expiry of the table an implementation ships, the last known offset is assumed and the result is provisional. Implementations must document which table they use and when it expires.
A change in UTC policy does not turn an expired table into a guarantee about the future.
The 2026 UTC decision
At its 28th meeting in October 2026, the General Conference on Weights and Measures adopted Resolution 5: continuous UTC takes effect on 20 May 2027, with the difference |UT1 − UTC| allowed to reach 3 600 s. The resolution sets a limit, not a scheduled correction.
For UTP this settles a question of emphasis. Avoiding future leap seconds is no longer a reason to choose it; the case rests on the representation and operation contract above. The leap seconds already in the record remain, so historical conversion still needs the table.
Status and open questions
UTP is a research draft. Its specification and test vectors are not yet published, and details may change before 1.0.0.
What the draft defines
- A data model of signed seconds and normalized ticks.
- A strict wire grammar with canonical and prefix forms.
- Normalization and overflow behaviour.
- Display tiers with half-to-even projection.
- Conversions to TAI, GPS time, Julian Date and POSIX time.
- Language-neutral test vectors.
What it does not claim
- Adoption by any standards body.
- A clock or a time-synchronization service.
- Clock accuracy to 100 ps.
- A specification, implementation or adoption of True Local Time or a new calendar.
- Completed, conforming implementations across languages.
- Compatibility before 1.0.0. Earlier drafts used a different tick and must be converted explicitly.
Open questions
- What UTP adds over continuous UTC in existing formats, including migration costs.
- Conversion data policy after the UTC transition.
- Whether a later version should specify True Local Time, a separate related proposal whose draft may be published on its own.
- Calendar design, kept separate from the instant protocol.
- Display that follows Earth rotation (UT1), a separate question from True Local Time.
- A reserved sub-tick extension; values finer than 1 ps would also need reference-frame metadata.
- A compact binary encoding.