/etc/localtimeと$TZに加えて、「日付」に影響を与える他の要素は何ですか?

/etc/localtimeと$TZに加えて、「日付」に影響を与える他の要素は何ですか?

時計がUTCに設定され、TZ環境変数のないFedora 20がインストールされています。この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/clockFedoraは後者を使用すると思います):

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/timezone/etc/sysconfig/clock。これがJavaプログラムで異なるタイムゾーン情報を見る理由です。

答え2

zoneinfoファイルで何が起こったかを見るには、zdumpを使用することをお勧めします。おそらく、いくつかの提案どおりに実際に置き換えられたかもしれません。

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

CETと表示された場合、誰かがファイルを交換したことを意味します。

答え3

/etc/sysconfig/clock ファイルが影響を受ける可能性があります。

関連情報