除了 /etc/localtime 和 $TZ 之外还有什么影响“date”?

除了 /etc/localtime 和 $TZ 之外还有什么影响“date”?

我安装了 fedora 20,时钟设置为 UTC,并且没有TZ环境变量。为什么该date命令输出CET时区中的日期(顺便说一下,这是我的本地时区)?

[fedora@slave2 ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 27 Apr  8  2014 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC
[fedora@slave2 ~]$ echo $TZ

[fedora@slave2 ~]$ env | grep TZ
[fedora@slave2 ~]$ date
Wed Mar 18 17:20:44 CET 2015

另外,在一个小 java 程序中询问时间会输出 UTC 时间(而如果我将 TZ 环境设置为 CET,则输出 CET 日期):

[fedora@slave2 ~]$ java DateDemo
Wed Mar 18 16:24:17 UTC 2015
[fedora@slave2 ~]$ TZ=CET java DateDemo
Wed Mar 18 17:24:24 CET 2015

(我DateDemo从那里得到了java代码http://www.tutorialspoint.com/java/java_date_time.htm

附加信息:

[fedora@slave2 ~]$ type date
date is hashed (/usr/bin/date)
[fedora@slave2 ~]$ set +h
[fedora@slave2 ~]$ type date
date is /usr/bin/date
[fedora@slave2 ~]$ date
Wed Mar 18 17:58:26 CET 2015
[fedora@slave2 ~]$ strace -fe open date
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
Wed Mar 18 18:02:41 CET 2015
+++ exited with 0 +++

转储:

[fedora@slave2 ~]$ zdump -v /etc/localtime | head
/etc/localtime  -9223372036854775808 = NULL
/etc/localtime  -9223372036854689408 = NULL
/etc/localtime  Mon Dec 31 23:53:55 1900 UTC = Mon Dec 31 23:59:59 1900 LMT isdst=0 gmtoff=364
/etc/localtime  Mon Dec 31 23:53:56 1900 UTC = Mon Dec 31 23:53:56 1900 WET isdst=0 gmtoff=0
/etc/localtime  Sun Sep 29 23:59:59 1946 UTC = Sun Sep 29 23:59:59 1946 WET isdst=0 gmtoff=0
/etc/localtime  Mon Sep 30 00:00:00 1946 UTC = Mon Sep 30 01:00:00 1946 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 31 00:59:59 1985 UTC = Sun Mar 31 01:59:59 1985 CET isdst=0 gmtoff=3600
/etc/localtime  Sun Mar 31 01:00:00 1985 UTC = Sun Mar 31 03:00:00 1985 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Sep 29 00:59:59 1985 UTC = Sun Sep 29 02:59:59 1985 CEST isdst=1 gmtoff=7200
/etc/localtime  Sun Sep 29 01:00:00 1985 UTC = Sun Sep 29 02:00:00 1985 CET isdst=0 gmtoff=3600

答案1

与几乎所有程序一样,该date命令依赖标准库来访问时区数据。在 Linux(某些嵌入式系统除外)和 *BSD 上,标准库根据/etc/localtime.

在您的系统上,似乎/etc/localtime不包含它似乎包含的内容。喜欢斯蒂芬·查泽拉斯德罗伯特,我强烈怀疑该文件/usr/share/zoneinfo/Etc/UTC/etc/localtime符号链接)包含不正确的信息,可能是因为不知道自己在做什么的人试图更改系统时区并最终覆盖了系统文件。

我建议重新安装时区信息,以确保您的系统没有损坏。运行rpm -qf /usr/share/zoneinfo/Etc/UTC以查看哪个包包含该文件并使用yum reinstall.然后正确设置时区,或者使用timedatectl命令或者通过更改/etc/localtime符号链接和文本文件/etc/zoneinfo/etc/sysconfig/clock(我认为 Fedora 使用后者):

ln -snf /usr/share/zoneinfo/Europe/Madrid /etc/localtime
echo Europe/Madrid >/etc/zoneinfo
sed -i -e '/^ *ZONE=/d' /etc/sysconfig/clock
echo 'ZONE="Europe/Madrid"' >>/etc/sysconfig/clock

Java 的做法不同— 它绕过标准库并读取/etc/timezoneor /etc/sysconfig/clock。这就是为什么您会看到来自 Java 程序的不同时区信息。

答案2

为什么不使用 zdump 来查看该 zoneinfo 文件发生了什么情况。也许它真的像一些人建议的那样被替换了:

# zdump /usr/share/zoneinfo/Etc/UTC
/usr/share/zoneinfo/Etc/UTC  Thu Mar 19 01:14:47 2015 UTC

如果它显示 CET,那么您就知道有人替换了该文件。

答案3

/etc/sysconfig/clock 文件可能会产生影响。

相关内容