残念ながら timedatectl set-timezone
は/etc/timezone
を更新しません。
現在のタイムゾーンをRegion/City
として取得するには、たとえば、次のように指定します。
% timedatectl | grep zone
Time zone: Asia/Kuala_Lumpur (+08, +0800)
私は最後の部分を手に入れることができます:
% date +"%Z %z"
+08 +0800
すべてのawk
- wardを取得せずにAsia/Kuala_Lumpur
パーツを取得するにはどうすればよいですか?
Linuxを使用していますが、POSIXの方法もありますか?
StéphaneChazelasによるこのコメント で、彼は言った:
timedatectl
はsystemd
に対してtimedated
をクエリするdbus
であり、timedated
はタイムゾーンの名前を導出します(_Europe/London
_など) )_/etc/localtime
_でreadlink()
を実行します。 _/etc/localtime
_がシンボリックリンクでない場合、それらのタイムゾーン定義ファイルにはその情報が含まれていないため、その名前を取得できません。
これと toniocのコメント に基づいて、以下をまとめます。
_#!/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
_
タイムゾーンには、地理位置情報を使用できます。
$ curl https://ipapi.co/timezone
America/Chicago
または:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago