Get current timezone as `Region/City`
Solution 1
In this comment by Stéphane Chazelas, he said:
timedatectl
is asystemd
thing that queriestimedated
overdbus
andtimedated
derives the name of the timezone (likeEurope/London
) by doing areadlink()
on/etc/localtime
. If/etc/localtime
is not a symlink, then that name cannot be derived as those timezone definition files don't contain that information.
Based on this and tonioc's comment, I put together the following:
#!/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 's@.*/zoneinfo/@@' | head -n1
fi
Solution 2
For the time zone, you can use geolocation:
$ curl https://ipapi.co/timezone
America/Chicago
Or:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
http://wiki.archlinux.org/index.php/time#Time_zone
Related videos on Youtube
Tom Hale
Updated on September 18, 2022Comments
-
Tom Hale over 1 year
Unfortunately
timedatectl set-timezone
doesn't update/etc/timezone
.How do I get the current timezone as
Region/City
, eg, given:% timedatectl | grep zone Time zone: Asia/Kuala_Lumpur (+08, +0800)
I can get the last part:
% date +"%Z %z" +08 +0800
How do I get the
Asia/Kuala_Lumpur
part without getting allawk
-ward?I'm on Linux, but is there also a POSIX way?
-
Tom Hale almost 6 yearsYou have a good eye, thanks for the update, @StephenKitt.