The leap second is one of the subtlest and most-dreaded mechanisms in the NTP protocol. Since 1972 it has compensated for the slow deceleration of Earth's rotation to keep UTC in phase with astronomical UT1. For an NTP server operator, each event has been a rehearsed minor crisis: 24 hours of advance warning, a switchover plan, and 48 hours of log scrutiny afterwards.
This page covers what every NTP operator or administrator needs to know: the origin of the mechanism, the 27-event history since 1972, how NTP signals the event, the two competing approaches (step and smear), chrony and ntpd behaviour, and the 2035 abolition voted in 2022.
Since 1972, UTC (Coordinated Universal Time) has been defined as the count of SI seconds emitted by an ensemble of atomic clocks. UT1, on the other hand, is the time defined by the actual rotation of the Earth, measured by VLBI interferometry on distant quasars. The two drift apart because the Earth is slowing down: tidal friction, internal mass redistribution, core-mantle interactions. Over the long term, UT1 falls behind UTC by an average 1 to 2 ms per day — one second every 12 to 24 months on average.
The IERS (International Earth Rotation Service) tracks this drift and, when it approaches 0.9 seconds, publishes a "Bulletin C" announcing a leap second six months in advance. The event takes place either on 30 June or 31 December at 23:59:59 UTC: the 23:59:60 second is inserted (the rare 61-second minute), followed by 00:00:00 of the next day.
10 signals this case.
From 1972 through end of 2016, 27 leap seconds were added. All positive. The five most recent, also those experienced by the RDEM infrastructure:
| UTC date | Local day (France) | Total since 1972 |
|---|---|---|
| 2005-12-31 23:59:60 | 1 January 2006 at 00:59:60 | 23 |
| 2008-12-31 23:59:60 | 1 January 2009 at 00:59:60 | 24 |
| 2012-06-30 23:59:60 | 1 July 2012 at 01:59:60 | 25 |
| 2015-06-30 23:59:60 | 1 July 2015 at 01:59:60 | 26 |
| 2016-12-31 23:59:60 | 1 January 2017 at 00:59:60 | 27 |
Since 1 January 2017, the TAI − UTC difference has remained fixed at 37 seconds. No leap second has been added for eight years — a historic record caused by the unexpected acceleration of Earth's rotation.
The NTP protocol (RFC 5905) reserves the two most significant bits of the first packet byte for the Leap Indicator (LI) field. Four possible values:
| LI value | Meaning | Usage |
|---|---|---|
| 00 | No warning | Normal operation (99.9% of the time) |
| 01 | Last minute of the day will have 61 seconds | Announced 24 h before addition |
| 10 | Last minute of the day will have 59 seconds | Announced for removal (never used to date) |
| 11 | Clock unsynchronised (alarm) | Equivalent to stratum 16 |
When a Stratum 1 server receives the information (via its GPS/DCF77 refclock, or via the signed leap-seconds.list file from NIST), it starts propagating LI=01 in its responses 24 hours before the event. chrony and ntpd clients read this bit on each poll and schedule the local insertion.
When 23:59:60 arrives, you must choose what happens on the system side:
Standard-compliant: the kernel inserts a true 61-second minute. This is the default for chrony and
ntpd with leapsecmode=system/step on Linux. Benefit: the clock stays strictly aligned with UTC.
Downside: two consecutive identical timestamps, and any application computing
timespec.tv_sec - previous can obtain 0, breaking second-based timers.
Popularised by Google in 2011: rather than a one-second jump, the clock is slowed by a few ppm over
a 20–24 hour window around the event. Each tick lasts 1.000011574 s instead of exactly
1.0 s — the second is absorbed progressively. Benefit: no non-monotonic timestamp,
no broken timer. Downside: during the smear window, the clock is up to 0.5 s off official
UTC, which can be visible from a non-smeared external source.
chrony.conf.
| Operator | Approach | Window |
|---|---|---|
| Google (time.google.com) | Smear | 24 h around UTC midnight |
| AWS (time.aws.com) | Smear | 24 h around UTC midnight |
| Facebook / Meta | Smear (linear 18 h) | 18 h centred on the event |
| Cloudflare (time.cloudflare.com) | Step (compliant) | — |
| NIST / time.nist.gov | Step | — |
| NTP Pool (pool.ntp.org) | Varies per operator | — |
| RDEM Systems (ntp.rdem-systems.com) | Step (RFC-compliant) | — |
chrony 4.x offers four modes, configured via leapsecmode in chrony.conf:
# /etc/chrony/chrony.conf
# Recommended mode for a production Stratum 2+ server:
# delegate leap insertion to the Linux kernel
leapsecmode system
# Alternative 1: 1-second step applied immediately
# leapsecmode step
# Alternative 2: progressive correction via slew (default rate 400 ppm)
# leapsecmode slew
# Alternative 3: smearing, with smoothtime
# leapsecmode ignore
# smoothtime 400 0.001 leaponly
# To test without waiting for the next event: local leap list file
leapsectz right/UTC
leapseclist /usr/share/zoneinfo/leap-seconds.list
The directive smoothtime 400 0.001 leaponly enables smearing limited to leap events.
Maximum applied offset is 0.5 s, spread over ~1000 seconds, compatible with most jump-sensitive
applications.
ntpd (reference or ntpsec) reads the leap-seconds.list file maintained by NIST:
# /etc/ntp.conf
# Signed reference file, updated by IERS/NIST
leapfile /usr/share/zoneinfo/leap-seconds.list
# Default behaviour: compliant 1-second step
# Disable if needed with:
# tinker step 0
# To use Linux kernel mode on sync:
# enable kernel
The leap-seconds.list file must be updated regularly — it expires 6 months after
issuance. Automate via cron:
0 3 * * 1 wget -q -O /usr/share/zoneinfo/leap-seconds.list https://data.iana.org/time-zones/tzdb-leap-seconds.list
chronyc tracking and ntpq -c rv remain the
only indispensable commands during the event. Keep a terminal open on them between 23:59:00 and
00:02:00 UTC.The 2016-12-31 event stands out as the most recent and the one where consumer tooling (smartphones, internet routers) had best converged toward correct behaviour. The ecosystem is more mature than in 2005 or 2008, when we had to explain LI=01 in client logs.
Even without an announcement on the horizon, maintaining the capacity to handle a leap second is part of NTP hygiene:
leap-seconds.list file on each server:
head /usr/share/zoneinfo/leap-seconds.list must show a future expiration date.if (new_ts == old_ts)
or assert ts_diff > 0 must be reviewed.In November 2022, the 27th General Conference on Weights and Measures (CGPM) voted the resolution abolishing leap seconds by 2035. The text plans to:
For NTP, this changes nothing in the protocol — the Leap Indicator field stays in place for archives and legacy systems. Its activation simply becomes exceptional, then zero. chrony and ntpd implementations will continue to support the mechanism for several more decades for compatibility.