[time.clock.tai.overview]

# 30 Time library [[time]](./#time)

## 30.7 Clocks [[time.clock]](time.clock#tai.overview)

### 30.7.4 Class tai_clock [[time.clock.tai]](time.clock.tai#overview)

#### 30.7.4.1 Overview [time.clock.tai.overview]

namespace std::chrono {class tai_clock {public:using rep = *a signed arithmetic type*; using period = ratio<*unspecified*, *unspecified*>; using duration = chrono::duration<rep, period>; using time_point = chrono::time_point<tai_clock>; static constexpr bool is_steady = *unspecified*; static time_point now(); template<class Duration>static utc_time<common_type_t<Duration, seconds>> to_utc(const tai_time<Duration>&) noexcept; template<class Duration>static tai_time<common_type_t<Duration, seconds>> from_utc(const utc_time<Duration>&) noexcept; };}

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L3059)

The clock tai_clock measures seconds since 1958-01-01 00:00:00
and is offset 10s ahead of UTC at this date[.](#1.sentence-1)

That is, 1958-01-01 00:00:00 TAI is equivalent to 1957-12-31 23:59:50 UTC[.](#1.sentence-2)

Leap seconds are not inserted into TAI[.](#1.sentence-3)

Therefore every time a leap second is inserted into UTC,
UTC shifts another second with respect to TAI[.](#1.sentence-4)

For example by 2000-01-01 there had been
22 positive and 0 negative leap seconds inserted
so 2000-01-01 00:00:00 UTC is equivalent to 2000-01-01 00:00:32 TAI
(22s plus the initial 10s offset)[.](#1.sentence-5)

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/time.tex#L3071)

tai_clock is not a [*Cpp17TrivialClock*](time.clock.req#:Cpp17TrivialClock "30.3 Cpp17Clock requirements [time.clock.req]") unless the implementation can guarantee that tai_clock​::​now() does not propagate an exception[.](#2.sentence-1)

[*Note [1](#note-1)*:

noexcept(from_utc(utc_clock​::​now())) is false[.](#2.sentence-2)

â *end note*]
