如何检查Linux中的时区?


Answers:


19

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


2
是否有任何命令可以告知用户所在的时区?

26
当然,date会告诉你。
Greg Hewgill

我有两个服务器实例,如果我在两个服务器上都给出“ date”命令,则显示不同的时间。两台服务器的时区均为IST,一台服务器的时区为:IST 2011年7月11日星期一10:39:31 IST 2011,另一台服务器为时区IST 2011年7月11日星期一..区别是4分钟

8
在精确的穿山甲上echo $TZ对我来说什么也没有回报。
伊恩·塞缪尔·麦克莱恩

3
@GregHewgill您的回答在第一眼没有帮助。请考虑编辑您的答案。请参阅下面的投票最多的答案。我现在将投票否决你的答案。另外,我的机器上默认没有TZ env。
therealmarv


54

如果需要数字时区:

date +'%:z %Z'

样本输出:

-05:00 EST

7
在OS X上,此输出:z EST
嫌疑人

7
如果是针对linux的话
保罗·巴尔加斯

1
更确切地说,这适用于GNU date。在我的情况下,BusyBox版本会打印出一些无关紧要的“%:z CEST”。
Lao Lam 2015年

但是,date +%z在OS X上可以正常工作。建议您修改答案。
尼尔·梅休

1
嗨,@NeilMayhew谢谢!姆......但问题有标签linux ubuntu-10.04
保罗·巴尔加斯·

24

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

  • / etc / timezone(在Ubuntu和Red Hat上存在?但在Amazon Linux上不存在)
  • (在Red Hat风格的系统上)如ZONE="US/Eastern"/ etc / sysconfig / clock
  • 或者您可以尝试将/ etc / localtime与/ usr / share / zoneinfo下的文件之一匹配;令人讨厌的是,这似乎不是符号链接,但是您可以例如

    cd / usr / share / zoneinfo
    查找*-类型f -exec sh -c“ diff -q / etc / localtime'{}'> / dev / null && echo {}” \;

    查找匹配的文件-可能有更好的方法,但是可行。将有多个比赛。


4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
2016年


6

有时您可能正在寻找规范的时区,而不是date %Z例如由产生的简短形式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

不幸的是,timedatectl需要set-timezone一个命令,但是没有相应的get-timezone。解析如下:

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

4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

所以我在山区时间。尽管上面有关使用环境变量或仅使用date命令输出的建议有时效果更好,具体取决于您要如何使用。



2
  • / etc / sysconfig / clock设置硬件时钟是以UTC还是本地时间存储。
  • 将/ etc / localtime链接到/ usr / share / zoneinfo / ...以设置时区。
  • 键入/sbin/hwclock --systohc [--utc]以设置硬件时钟。

无论您的硬件时钟是否存储为UTC,Linux内核始终将时间存储并计算为自1970年1月1日午夜以来的秒数。转换为本地时间是在运行时完成的。一件很整洁的事情是,如果有人使用其他时区的计算机,他们可以设置TZ环境变量,并且所有日期和时间都将显示为其时区正确的。

如果自1970年1月1日UTC以来的秒数存储为带符号的32位整数(如在Linux / Intel系统上),则您的时钟将在2038年的某个时候停止工作。Linux没有内在的Y2K问题,但确实有2038年的问题。希望届时我们都能在64位系统上运行Linux。64位整数将使我们的时钟运行良好,直到大约29.271亿年前。


1

几个解决方案:

date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone

给我(分别):

UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC

我的计算机在UTC上。


0

使用TZ或日期不可靠,因为它会告诉您用户的时区,而不是默认的系统时区。

缺省系统时区存储在/ etc / timezone中(通常是到特定于时区的时区数据文件的符号链接)。如果没有/ etc / timezone,请查看/ etc / localtime。通常,这就是“服务器”的时区。/ etc / localtime通常是/ usr / share / zoneinfo中的时区文件的符号链接。正确的时区文件路径通常也会为您提供地理信息。

较新的Linux具有“ timedatectl”,在运行命令时可为您提供大量信息。

(作为副节点,如果您有一个仍使用OLD硬编码时区的古老系统,则可能可以将一个现代时区文件复制到该文件上,并且它可以正常工作。我不得不这样做很多次才能解决更改时区问题在较旧的设备上)。


0

有时timedatectl set-timezone不会更新/etc/timezone,因此最好从symlink /etc/timezone指向的文件名中获取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

参考文献:在此回答


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.