Set Linux Time Zones and NTP Safely with timedatectl

Get the time zone wrong on a server and every log timestamp, cron job and certificate check quietly drifts with it, which is why timedatectl exists. It inspects the clock, changes the time zone, checks network synchronisation and controls what happens to the hardware clock. The examples use timedatectl from systemd 255.4, installed here as Ubuntu package version 255.4-1ubuntu8.17.

Allow about ten minutes for a read-only check, or fifteen minutes if you need to change a setting. You need a shell and a systemd host. The inspection commands are ordinary user commands. Changes to the system clock, time zone, RTC mode or NTP service normally require authentication, so the examples use sudo.

Safety boundary: Changing time can break logs, certificates, scheduled jobs and distributed systems. Record the current state before changing it. Do not use a guessed time zone or switch the RTC to local time just to make one display look right.

1. Record the current clock state

Start with the human-readable status view. With no command, status is implied:

$ timedatectl --no-pager status
               Local time: Mon 2026-09-28 09:23:27 BST
           Universal time: Mon 2026-09-28 08:23:27 UTC
                RTC time: Mon 2026-09-28 08:23:27
               Time zone: Europe/London (BST, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

The exact date, server and time zone will differ. The useful fields are the time zone, whether the system clock is synchronised, whether an NTP service is active and whether the RTC is kept in local time. Save the relevant values before a change:

$ timedatectl --no-pager show --property=Timezone --property=NTPSynchronized --property=NTP --property=LocalRTC
Timezone=Europe/London
LocalRTC=no
NTP=yes
NTPSynchronized=yes

Checkpoint: Keep the old Timezone value as ORIGINAL_ZONE if you are about to change it. The output from show is intended for scripts; use status when a person needs the formatted overview.

2. Choose a valid time zone

Do not guess the spelling. Ask the installed system for its available zone names, then select one exact entry:

$ timedatectl list-timezones | grep -E '^(Europe/London|UTC)$'
Europe/London
UTC

This list is one time zone per line. It comes from the host, so a zone present on one machine may not be available on another. The command is read-only and does not need elevated privileges.

3. Change the system time zone

Once you have checked the intended value, apply it:

$ sudo timedatectl set-timezone Europe/London

This changes the /etc/localtime symlink. It changes how local time is displayed and interpreted; it does not set the system clock to a new instant. Confirm the result:

$ timedatectl --no-pager status
               Time zone: Europe/London (BST, +0100)

If the result is wrong, restore the value you recorded rather than inventing a reversal:

$ sudo timedatectl set-timezone ORIGINAL_ZONE

Replace ORIGINAL_ZONE with the actual value, such as UTC. There is no useful universal undo command because the previous zone is host-specific.

4. Check network time synchronisation

The top-level status tells you whether the system considers the clock synchronised. On a host using systemd-timesyncd, inspect the protocol details with:

$ timedatectl --no-pager timesync-status
       Server: 2a01:4f8:0:a112::2:2 (ntp2.hetzner.com)
Poll interval: 34min 8s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 2
      Offset: -176us
       Delay: 523us

Server addresses, offsets and poll intervals vary. A successful command only means that status was available; judge synchronisation from the fields and from System clock synchronized, not from a copied example.

For a machine-parsable view, use show-timesync. Empty properties are hidden unless you add --all, and --property=NAME limits the output:

$ timedatectl --no-pager show-timesync --property=ServerName --property=PollIntervalUSec
ServerName=ntp2.hetzner.com
PollIntervalUSec=2048000000

These timesync commands describe systemd-timesyncd specifically. If another NTP implementation manages the host, its service and logs are the better place to investigate.

5. Enable or disable NTP deliberately

set-ntp true enables and starts the first available network synchronisation service. set-ntp false disables and stops the known network synchronisation services:

$ sudo timedatectl set-ntp true
$ timedatectl --no-pager show --property=NTP --property=NTPSynchronized
NTP=yes
NTPSynchronized=yes

Do not treat NTP=yes as proof that a fresh sync has already completed. It indicates that network synchronisation is enabled. Check NTPSynchronized=yes or inspect timesync-status before relying on the clock.

Warning: Disabling NTP is a service-disrupting change for systems that depend on accurate time. If you temporarily disabled it, the recovery command is:

$ sudo timedatectl set-ntp true
$ timedatectl --no-pager status

If enabling NTP fails, the command may have no suitable synchronisation service to start. Check the host's service installation and configuration instead of repeatedly retrying with sudo.

6. Keep the RTC in UTC

Linux works best when the hardware real-time clock is maintained in UTC. Check the final status line:

$ timedatectl --no-pager show --property=LocalRTC
LocalRTC=no

LocalRTC=no means UTC mode. The alternative, LocalRTC=yes, keeps the RTC in local time. The manpage warns that local RTC mode is not fully supported and can cause problems when time zones or daylight saving rules change. Keep UTC mode unless a specific dual-boot or hardware requirement has been assessed.

If you have a documented reason to change the mode, understand the side effect first. set-local-rtc also synchronises the RTC from the system clock unless --adjust-system-clock is supplied:

$ sudo timedatectl set-local-rtc 0
$ timedatectl --no-pager show --property=LocalRTC
LocalRTC=no

That command restores the recommended UTC mode. Do not use set-local-rtc 1 as a display fix. It changes the third line of /etc/adjtime and changes how the system interprets the hardware clock.

7. Set the clock only when you have a recovery plan

Manual clock setting is a last resort. It updates the system clock and the RTC. First stop relying on an NTP answer that may immediately correct your manual value, then set an unambiguous time:

$ sudo timedatectl set-ntp false
$ sudo timedatectl set-time '2026-09-28 09:30:00'
$ timedatectl --no-pager status

Use a quoted value in the documented YYYY-MM-DD HH:MM:SS form. Check logs and applications after the change. Restore network synchronisation when the manual correction is finished:

$ sudo timedatectl set-ntp true
$ timedatectl --no-pager status

Do not perform this step on a production host during a busy period without coordinating the effect on services. If the host is already synchronised, there is normally no reason to set the clock manually.

Done means