如何在 Linux 中检查哪个时区?

157 linux ubuntu-10.04

有没有办法在 Linux 上检查我当前所在的时区?

小智 277

如果您的意思是从控制台,只需键入:

date +%Z
Run Code Online (Sandbox Code Playgroud)

  • 这为我提供了“+07”。要在基于 Debian / Arch 的 Linux 上获取“区域/城市”,请参阅[此答案](https://superuser.com/a/1334239/365890)。 (2认同)

Pau*_*gas 69

如果你想要数字时区:

date +'%:z %Z'

示例输出:

-05:00 EST
Run Code Online (Sandbox Code Playgroud)

  • 在 OS X 上输出`:z EST` (8认同)
  • 这对于 [tag:linux]。 (8认同)

Rup*_*Rup 28

我想找到“美国/东部”或“欧洲/伦敦”形式的时区。您可以在以下位置找到:

  • /etc/timezone(存在于 Ubuntu 和 Red Hat?但不包括 Amazon Linux)
  • (在 Red Hat 风格的系统上)如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 {}" \;

    找到匹配的文件 - 可能有更好的方法来做到这一点,但这是有效的。会有多场比赛。

  • `find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)` (6认同)

Gre*_*ill 25

通常,TZ环境变量会告诉您一些有用的信息。但是,最好使用诸如mktime()和 之类的函数localtime()time_t和 本地时区表示之间进行转换。也就是说,不要尝试自己进行转换

  • 当然,`date` 会告诉你的。 (30认同)
  • On Precise Pangolin `echo $TZ` 对我没有任何回报。 (10认同)
  • @GregHewgill 乍一看,您的回答没有帮助。请考虑编辑您的答案。请参阅下面投票最多的答案。我现在会否决你的答案。此外,我的机器上默认没有 TZ env。 (3认同)
  • 是否有任何命令可以说明用户所在的时区? (2认同)

小智 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)

不幸的是,timedatectlset-timezone作为命令,但没有对应的get-timezone. 解析如下:

# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
Run Code Online (Sandbox Code Playgroud)


Ste*_*nny 7

对于时区,您可以使用地理定位:

$ 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

  • 只是想指出,虽然这很可能会返回服务器所在的正确时区,但不一定返回服务器配置的时区。 (3认同)

Bur*_*eSE 5

以下所有解决方案都会为您提供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 尚未准备好统治世界。反而...

使用Systemdsed

改进拉曼的答案,但没有无用地使用 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)

使用 GNUrealpath因为/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 不是符号链接;使用findsedmd5sum

如果您发现自己有一个非符号链接/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:政治:

最后,我恳求您不要使用此方法来绑定您的用户并窃取他们的代理权 - 仅当他们要求您这样做时才使用此方法!

另请注意,虽然这些服务是免费的,但请在使用前考虑访问其各自的网站以了解并接受其条款和条件。