Dans ce commentaire de Stéphane Chazelas, il a déclaré :
timedatectl
est unsystemd
chose qui interrogetimedated
plus dedbus
ettimedated
dérive le nom du fuseau horaire (commeEurope/London
) en faisant unreadlink()
le/etc/localtime
. Si/etc/localtime
n'est pas un lien symbolique, alors ce nom ne peut pas être dérivé car ces fichiers de définition de fuseau horaire ne contiennent pas cette information.
Sur la base de ceci et du commentaire de tonioc, j'ai rassemblé ce qui suit :
#!/bin/bash
set -euo pipefail
if filename=$(readlink /etc/localtime); then
# /etc/localtime is a symlink as expected
timezone=${filename#*zoneinfo/}
if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
# not pointing to expected location or not Region/City
>&2 echo "$filename points to an unexpected location"
exit 1
fi
echo "$timezone"
else # compare files by contents
# https://stackoverflow.com/questions/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
cmp -s {} /etc/localtime \; -print | sed -e '[email protected]*/zoneinfo/@@' | head -n1
fi
Pour le fuseau horaire, vous pouvez utiliser la géolocalisation :
$ curl https://ipapi.co/timezone
America/Chicago
Ou :
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
http://wiki.archlinux.org/index.php/time#Time_zone