Comandes LinuxGuies de LinuxInformació del sistema LinuxLinux

Canviar la zona horària a Linux: timedatectl pas a pas

Cambiar la zona horaria en Linux: guía rápida para administradores.


Tenir la zona horària ben configurada és més important del que sembla: d’ella depenen l’hora dels registres, les tasques programades amb cron, les dates dels fitxers i de les bases de dades… Si gestiones servidors en diferents llocs (o una màquina virtual que s’ha creat amb la zona per defecte, normalment UTC), aquesta guia t’explica com veure-la i canviar-la de manera correcta.

Com funciona la hora a Linux

  • El sistema treballa internament en UTC (temps universal coordinat).
  • La zona horària només decideix com es mostra aquesta hora: Europe/Madrid, America/Chicago… És un enllaç simbòlic, /etc/localtime, que apunta a un fitxer de /usr/share/zoneinfo/.
  • El rellotge de maquinari (RTC), el de la placa base, manté l’hora quan l’equip està apagat; a Linux, normalment està en UTC.
  • La sincronització NTP corregeix el rellotge automàticament a partir de servidors d’Internet.

Per això, canviar la zona horària no canvia l’hora real del sistema: només la manera de mostrar-la.

La manera recomanada: timedatectl

A qualsevol distribució amb systemd, timedatectl ho fa tot: consultar, canviar la zona i activar el NTP.

Veure la configuració actual

$ timedatectl
               Local time: Sun 2026-10-04 09:02:39 CEST
           Universal time: Sun 2026-10-04 07:02:39 UTC
                 RTC time: n/a
                Time zone: Europe/Madrid (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
  • Local time i Universal time: l’hora local i en UTC.
  • RTC time: l’hora del rellotge de maquinari (n/a en un Raspberry Pi, que no en té).
  • Time zone: la zona, l’abreviatura actual (CEST a l’estiu, CET a l’hivern) i la diferència amb UTC.
  • System clock synchronized i NTP service: si el rellotge està sincronitzat i si el servei NTP està actiu.
  • RTC in local TZ: si el rellotge de maquinari va en hora local (hauria de ser no; vegeu més avall).

Buscar el nom de la zona

Les zones tenen noms del tipus Continent/Ciutat:

$ timedatectl list-timezones | grep -E 'Madrid|Andorra|Canary'
Atlantic/Canary
Europe/Andorra
Europe/Madrid

Canviar-la

sudo timedatectl set-timezone Europe/Madrid

El canvi és immediat i no cal reiniciar res. Els serveis que ja estaven en marxa (per exemple, cron o una base de dades) poden continuar fent servir la zona antiga fins que els reinicies; si és un servidor en producció, reinicia’ls o reinicia la màquina en un moment tranquil.

Per a un servidor, molts administradors prefereixen deixar-lo en UTC (sudo timedatectl set-timezone UTC): no té canvis d’horari d’estiu, i els registres de màquines de països diferents es poden comparar directament.

La manera manual (sense systemd)

Si el sistema no té systemd (contenidors, sistemes molt antics), pots fer a mà el que fa timedatectl, que és canviar l’enllaç /etc/localtime:

ls -l /etc/localtime                                      # on apunta ara
sudo ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime

-s crea un enllaç simbòlic i -f substitueix el que ja hi havia. No cal fer cap còpia de seguretat del fitxer antic: n’hi ha prou d’apuntar-te on apuntava l’enllaç (la primera comanda).

A Debian i Ubuntu també existeix el fitxer /etc/timezone, amb el nom de la zona en text (Europe/Madrid); timedatectl l’actualitza sol. Una altra opció, amb menús, és sudo dpkg-reconfigure tzdata.

Compte amb els noms antics

L’original d’aquest article feia servir US/Central. Aquest tipus de noms (US/…, Canada/…, GB, Japan…) són àlies antics que es mantenen per compatibilitat. A Debian 13 i Ubuntu 24.04 i posteriors ja no s’instal·len per defecte (són al paquet tzdata-legacy), així que l’enllaç quedaria trencat. Fes servir sempre el nom canònic: America/Chicago en lloc de US/Central, America/New_York en lloc de US/Eastern, etc.

Una zona diferent per a un usuari o una comanda

La zona del sistema és la mateixa per a tothom, però cada procés pot fer servir la seva amb la variable d’entorn TZ:

$ TZ=America/New_York date
Sun  4 Oct 03:02:40 EDT 2026
$ date -u
Sun  4 Oct 07:02:40 UTC 2026

Si un usuari vol veure sempre l’hora d’una altra zona, pot posar export TZ=America/New_York al seu ~/.bashrc. Més informació a les variables d’entorn a Linux.

L’hora: sincronització NTP

Si l’hora és incorrecta (no la zona, sinó l’hora en si), el millor és no posar-la a mà sinó activar la sincronització:

sudo timedatectl set-ntp true

Necessita un servei NTP instal·lat: systemd-timesyncd (Debian, Ubuntu) o chronyd (RHEL, Fedora). Tens com comprovar-ho a com saber si el sistema sincronitza el rellotge amb NTP.

Si de totes maneres has de posar l’hora a mà (una màquina sense xarxa), primer desactiva el NTP i després fes servir timedatectl:

sudo timedatectl set-ntp false
sudo timedatectl set-time "2026-10-04 15:06:00"

La forma clàssica date MMDDhhmm (per exemple, sudo date 10041506 per al 4 d’octubre a les 15:06) també funciona, però és fàcil equivocar-se amb l’ordre dels camps; date -s "2026-10-04 15:06" és més clara.

El rellotge de maquinari

timedatectl set-time ja actualitza el rellotge de maquinari. Si canvies l’hora d’una altra manera, el pots actualitzar amb:

sudo hwclock --systohc

Canviar només la zona horària no requereix tocar el rellotge de maquinari, perquè aquest va en UTC. L’única excepció és en equips amb arrencada dual amb Windows, que per defecte posa el rellotge de maquinari en hora local: si l’hora es desquadra en canviar de sistema, pots fer que Linux també el faci servir en hora local amb sudo timedatectl set-local-rtc 1, tot i que no és el recomanat.

Problemes habituals

  • L’hora surt bé però amb una o dues hores de diferència: la zona horària és incorrecta (sovint, UTC). Canvia-la amb set-timezone.
  • L’hora es desquadra uns minuts cada dia: el NTP no està actiu. Comprova System clock synchronized amb timedatectl.
  • Una aplicació mostra una hora diferent de la del sistema: pot tenir la seva pròpia zona configurada (PHP amb date.timezone, MySQL amb time_zone, Java…) o haver-se iniciat abans del canvi. Reinicia-la i revisa’n la configuració.
  • systemctl restart systemd-timedated, que proposava l’original, no cal: aquest servei només s’activa quan fas servir timedatectl i no guarda cap estat.

Posts relacionats