Answers:
通常,TZ
环境变量会告诉您一些有用的信息。但是,最好使用诸如mktime()
和等功能localtime()
在time_t
本地时区表示之间进行转换。也就是说,不要尝试自己进行转换。
date
会告诉你。
echo $TZ
对我来说什么也没有回报。
如果您是从控制台说的话,只需输入:
date +%Z
我想以“美国/东部”或“欧洲/伦敦”的形式找到时区。您可以在以下位置找到它:
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 {}” \;
查找匹配的文件-可能有更好的方法,但是可行。将有多个比赛。
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
对于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: \(.*\) (.*)$/\1/g'`
US/Eastern
对于时区,可以使用地理位置:
$ curl https://ipapi.co/timezone
America/Chicago
要么:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/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亿年前。
使用TZ或日期不可靠,因为它会告诉您用户的时区,而不是默认的系统时区。
缺省系统时区存储在/ etc / timezone中(通常是到特定于时区的时区数据文件的符号链接)。如果没有/ etc / timezone,请查看/ etc / localtime。通常,这就是“服务器”的时区。/ etc / localtime通常是/ usr / share / zoneinfo中的时区文件的符号链接。正确的时区文件路径通常也会为您提供地理信息。
较新的Linux具有“ timedatectl”,在运行命令时可为您提供大量信息。
(作为副节点,如果您有一个仍使用OLD硬编码时区的古老系统,则可能可以将一个现代时区文件复制到该文件上,并且它可以正常工作。我不得不这样做很多次才能解决更改时区问题在较旧的设备上)。
有时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
参考文献:在此回答。
您可以同时显示日期和时区:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'