
時計が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/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/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 ファイルが影響を受ける可能性があります。