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

#1 楼

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

评论


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

–胡西·侯赛因
2011年7月11日下午5:00

当然,日期会告诉您。

– Greg Hewgill
2011年7月11日下午5:01

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

–胡西·侯赛因
2011年7月11日下午5:06

在精确的穿山甲上,$ TZ对我没有任何回报。

–伊恩·塞缪尔·麦克莱恩·艾尔德(Iain Samuel McLean Elder)
13-10-5在19:48

@GregHewgill您的回答在第一眼没有帮助。请考虑编辑您的答案。请参阅下面投票最多的答案。我暂时不赞成你的回答。另外,我的机器上默认没有TZ env。

–therealmarv
16年6月21日在15:52



#2 楼

如果您是从控制台说的话,只需输入:

date +%Z


评论


好点...改变了答案

–拉斯曼
2014年6月19日15:44

要从Ubuntu中的命令行设置时区,以下链接提供了简单的1行命令:askubuntu.com/a/524362/182454

–丹·尼森鲍姆(Dan Nissenbaum)
16 Dec 15'在6:30

这给我+07。要在基于Debian / Arch的Linux上获得Region / City,请参见此答案。

–汤姆·黑尔
18年6月26日在6:55

#3 楼

如果需要数字时区:
date +'%:z %Z'
样本输出:
-05:00 EST


评论


在OS X上,输出为:z EST

–嫌疑犯
15年2月13日在17:01

如果用于linux。

– Paul Vargas
15年2月13日在17:18

更确切地说,这适用于GNU日期。在我的情况下,BusyBox版本打印出一些毫无意义的东西,“%:z CEST”。

–林é
15年6月3日在18:42

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

–尼尔·梅休(Neil Mayhew)
15年8月14日在17:22

嗨,@NeilMayhew谢谢!嗯...但是这个问题有标签linux ubuntu-10.04

– Paul Vargas
15年8月14日在17:29

#4 楼

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


/ etc / timezone(在Ubuntu和Red Hat上存在?但在Amazon Linux上不存在)
(在Red Hat风格系统上)作为ZONE="US/Eastern"在/ etc / sysconfig / clock

,或者您可以尝试将/ etc / localtime与/ usr / share / zoneinfo下的文件之一匹配;令人讨厌的是,这似乎不是符号链接,但是您可以例如


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


查找匹配的文件-可能有更好的方法,但是可以用。将有多个匹配项。



评论


找到/ usr / share / zoneinfo / -type f | xargs md5sum | grep $(md5sum / etc / localtime | cut -d''-f1)

–freiheit
16年7月4日在18:25

#5 楼

对于ubuntu,请尝试以下方法:

$ cat /etc/timezone


样本输出:

Asia/Kolkata


其他发行版参考:https:/ /unix.stackexchange.com/questions/110522/timezone-setting-in-linux

评论


有时timedatectl set-timezone不会更新/ etc / timezone。请参阅此答案以获取基于/ etc / localtime的解决方案。

–汤姆·黑尔
18年6月26日在6:56

#6 楼

有时,您可能会寻找规范的时区,而不是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


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

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


#7 楼

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

$ curl https://ipapi.co/timezone
America/Chicago


或:

$ curl http://ip-api.com/line?fields=timezone
America/Chicago


http:// wiki.archlinux.org/index.php/time#Time_zone

评论


只是要指出,尽管这可能会返回服务器所在的正确时区,但不一定返回服务器配置的时区。

– Art Geigel
20年9月3日,12:11

#8 楼

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


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

#9 楼


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

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

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

#10 楼

我有Linux Mint Cinnamon。
timedatectl提供了我所需的信息:
                  Local time: Mon 2020-06-29 11:04:27 PDT
              Universal time: Mon 2020-06-29 18:04:27 UTC
                    RTC time: Mon 2020-06-29 18:04:27
                   Time zone: America/Vancouver (PDT, -0700)
   System clock synchronized: yes

systemd-timesyncd.service有效:是
本地TZ中的RTC:否

#11 楼

几个解决方案:

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


(分别)给我:

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


我的计算机位于UTC上。

#12 楼

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

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

较新的linux具有“ timedatectl”,当运行命令时,它将为您提供大量信息。

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

#13 楼

有时timedatectl set-timezone不会更新/etc/timezone,因此最好从符号链接/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


参考文献:在此答案中。

#14 楼

您可以同时显示日期和时区:

date +'%d/%m/%Y  %H:%M:%S [%:z  %Z]'


#15 楼

以下所有解决方案都将为您提供IANA兼容的Olson时区ID(例如America/Los_Angeles)。但是,有些变量可能最后会返回额外的空格。
使用环境
环境变量TZ包含*时区。如果您担心要在应用程序和用户之间建立协议,则最好进行检查。
$ echo $TZ

我可以亲自确认这至少可以在我的两台现代Linux计算机上运行,​​并且非常适合首先要检查的好变量。
使用timedatectlsed

改进了拉曼的答案,但没有无用的使用grep。与许多现代Linux发行版一样,此解决方案是使用SystemD的系统的最佳选择。
$ timedatectl | sed -n 's/^\s*Time zone: \(.*\) (.*//p'

使用/etc/timezone

这是一个简单易读的文件,但似乎不可用在更多发行版上。 IIRC,这是那些Debian开发者不久前提出的想法。
$ cat /etc/timezone

使用GNU realpath,因为/etc/localtime是一个符号链接
如果您知道/etc/localtime,则此解决方案是最佳的是一个符号链接,许多旧版软件和指南都可以完成,甚至现代SystemD都可以实现。并且您还具有可用的GNU realpath,在每个GNU OS发行版中也应该可用。
$ realpath --relative-to /usr/share/zoneinfo /etc/localtime

哦! /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'

如果您只想返回一个时区ID(取决于一个Chourst熵决定),则可以在第一个匹配项之后使用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'

使用curl和地理位置
如果由于某种原因您不希望或不信任主机的配置,但是您确定主机可以连接到更广阔的世界,则有几种免费的在线服务可以为您定位(当它们持续时)。下面是一些示例:
$ curl -Lsf https://ipapi.co/timezone

$ curl -Lsf http://ip-api.com/line?fields=timezone

$ curl -Lsf https://ipwhois.app/line/?objects=timezone

前两个服务从史蒂文·彭妮的答案中被无耻地窃取了。