很遗憾timedatectl set-timezone
不更新/etc/timezone
。
如何获取当前时区Region/City
,例如,给定:
% timedatectl | grep zone
Time zone: Asia/Kuala_Lumpur (+08, +0800)
我可以得到最后一部分:
% date +"%Z %z"
+08 +0800
Asia/Kuala_Lumpur
如何在不获得全部保护的情况下获得该部分awk
?
我使用的是 Linux,但是还有 POSIX 方式吗?
答案1
在史蒂芬·查泽拉斯 (Stéphane Chazelas) 的评论, 他说:
timedatectl
是通过执行 on查询systemd
并派生时区名称(如)的东西。如果不是符号链接,则无法派生该名称,因为这些时区定义文件不包含该信息。timedated
dbus
timedated
Europe/London
readlink()
/etc/localtime
/etc/localtime
基于此和托尼奥克的评论,我整理了以下内容:
#!/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
答案2
对于时区,您可以使用地理位置:
$ curl https://ipapi.co/timezone
America/Chicago
或者:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago