如果你想要数字时区:
date +'%:z %Z'
样本输出:
-05:00 EST
通常情况下,TZ
环境变量会告诉你一些有用的信息。但是,最好使用像mktime()
和localtime()
这样的函数在time_t
和本地时区表示之间进行转换。也就是说,不要尝试自己做转换。
对于ubuntu,可以试试这个:
$ cat /etc/timezone
输出示例:
Asia/Kolkata
其他发行版参考 : https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
有时,你可能要找的是典型的时区,而不是date %Z
产生的简略形式,例如US/Eastern
。在带timedatectl
的系统中,例如Fedora,timedatectl
会输出很多有用的信息,包括当前区域:
# timedatectl
Local time: Tue 2016-09-13 17:10:26 EDT
Universal time: Tue 2016-09-13 21:10:26 UTC
RTC time: Tue 2016-09-13 21:10:26
Time zone: US/Eastern (EDT, -0400)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
不幸的是,timedatectl
将set-timezone
作为命令,但没有相应的get-timezone
。解析如下:
# timedatectl status | grep "zone" | sed -e 's/^[]*Time zone: \(.*\) (.*)$//g'`
US/Eastern
对于时区,你可以使用地理位置:
$ curl https://ipapi.co/timezone
America/Chicago
或者:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
您可以同时显示日期和时区:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'
有时候timedatectl set-timezone
不更新/etc/timezone
,所以最好从/etc/timezone
的symlink指向的文件名中获取tiemzone:
#!/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
参考文献:在本答案中。