小智 277
如果您的意思是从控制台,只需键入:
date +%Z
Run Code Online (Sandbox Code Playgroud)
Pau*_*gas 69
如果你想要数字时区:
date +'%:z %Z'示例输出:
-05:00 EST
Run Code Online (Sandbox Code Playgroud)
Rup*_*Rup 28
我想找到“美国/东部”或“欧洲/伦敦”形式的时区。您可以在以下位置找到:
ZONE="US/Eastern"/etc/sysconfig/clock或者您可以尝试将 /etc/localtime 与 /usr/share/zoneinfo 下的文件之一匹配;令人讨厌的是,这似乎不是符号链接,但是您可以例如
cd /usr/share/zoneinfo
find * -type f -exec sh -c "diff -q /etc/localtime '{}' > /dev/null && echo {}" \;
找到匹配的文件 - 可能有更好的方法来做到这一点,但这是有效的。会有多场比赛。
Gre*_*ill 25
通常,TZ环境变量会告诉您一些有用的信息。但是,最好使用诸如mktime()和 之类的函数localtime()在time_t和 本地时区表示之间进行转换。也就是说,不要尝试自己进行转换。
小智 15
对于 ubuntu,试试这个:
$ cat /etc/timezone
Run Code Online (Sandbox Code Playgroud)
示例输出:
Asia/Kolkata
Run Code Online (Sandbox Code Playgroud)
对于其他发行版参考:https : //unix.stackexchange.com/questions/110522/timezone-setting-in-linux
Ram*_*man 12
有时您可能正在寻找规范时区而不是由date %Zeg生成的简短形式US/Eastern。在timedatectlFedora 等系统上,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
Run Code Online (Sandbox Code Playgroud)
不幸的是,timedatectl将set-timezone作为命令,但没有对应的get-timezone. 解析如下:
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Run Code Online (Sandbox Code Playgroud)
对于时区,您可以使用地理定位:
$ curl https://ipapi.co/timezone
America/Chicago
Run Code Online (Sandbox Code Playgroud)
或者:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
Run Code Online (Sandbox Code Playgroud)
http://wiki.archlinux.org/index.php/time#Time_zone
以下所有解决方案都会为您提供IANA 兼容的 Olson 时区 ID(例如America/Los_Angeles)。但是,有些可能会在开头和/或结尾返回额外的空格 - 如果需要则进行修剪。
环境变量TZ(如果设置)指定 timezone。首先检查这一点至关重要。
$ echo $TZ
Run Code Online (Sandbox Code Playgroud)
我个人可以确认这适用于我所有的现代 Linux 主机。
Systemd版本 >= 241对于所有相信 Systemd 将统治世界的人来说,这是首选方法。
$ timedatectl show --va -p Timezone
Run Code Online (Sandbox Code Playgroud)
如果您收到类似的错误,timedatectl: invalid option -- 'p'则意味着您的 Systemd 尚未准备好统治世界。反而...
Systemd和sed改进拉曼的答案,但没有无用地使用 grep。此解决方案最适合使用旧版本 Systemd 的系统。
$ timedatectl | sed -n 's/^\s*Time zone: \(.*\) (.*/\1/p'
Run Code Online (Sandbox Code Playgroud)
/etc/timezone这是一个简单的可读文件,但似乎不再在许多发行版上可用。IIRC,这是 Debian 开发人员不久前提出的东西,但后来失宠了。
$ cat /etc/timezone
Run Code Online (Sandbox Code Playgroud)
realpath因为/etc/localtime是符号链接如果您知道这/etc/localtime是一个符号链接,则此解决方案是最佳的,这是许多旧软件和指南完成的事情,甚至是现代 SystemD 所承诺的;并且您还可以使用 GNU realpath,它也应该在每个 GNU OS 发行版上可用。
$ realpath --relative-to /usr/share/zoneinfo /etc/localtime
Run Code Online (Sandbox Code Playgroud)
/etc/localtime 不是符号链接;使用find,sed,md5sum如果您发现自己有一个非符号链接/etc/localtime(上面显示的命令要么出错,要么提供以 开头的路径../),您可以尝试在本地时区数据库中查找其 md5 匹配。这可能会返回多个匹配项,因为 Olson 数据库中有相当多的别名。
$ find /usr/share/zoneinfo -type f -exec md5sum {} + |\
sed /$(printf $(md5sum /etc/localtime))/'!d;s/.\{54\}//;/^posix/d'
Run Code Online (Sandbox Code Playgroud)
如果您只想返回一个时区 ID(以系统的readdir()首先返回的那个为准),您可以使用 sed 的q命令在第一个匹配后退出。head例如,这比启动的性能要高得多。但是,这会导致早期find中断管道md5sum,导致打印到 fd 2 时出错。您可以通过将其管道传输到 /dev/null 来忽略此错误,如以下完整命令所示:
$ find /usr/share/zoneinfo -type f -exec md5sum {} + 2> /dev/null |\
sed /$(printf $(md5sum /etc/localtime))/'!d;s/.\{54\}//;/^posix/d;q'
Run Code Online (Sandbox Code Playgroud)
curl和地理定位如果出于某种原因您不想或不信任主机的配置(或者只是讨厌他们的胆量),但您确定它可以连接到更广泛的万维网,有几种免费的在线服务可以对您进行地理定位(趁他们还在的时候)。以下是一些示例:
$ curl -Lsf https://ipapi.co/timezone # Defunct?
$ curl -Lsf http://ip-api.com/line?fields=timezone
$ curl -Lsf https://ipwhois.app/line/?objects=timezone
$ curl -Lsf http://api.ipgeolocation.io/timezone -e ';auto' | jq -r .timezone
Run Code Online (Sandbox Code Playgroud)
前两个服务无耻地从Steven Penny 的答案中窃取。此外,我恳请 SE 社区保持此列表的最新状态并提供工作链接,谢谢!
CW:政治:
最后,我恳求您不要使用此方法来绑定您的用户并窃取他们的代理权 - 仅当他们要求您这样做时才使用此方法!
另请注意,虽然这些服务是免费的,但请在使用前考虑访问其各自的网站以了解并接受其条款和条件。