시계가 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
거기에서 자바 코드를 얻었다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
자바는 다르게 한다— 표준 라이브러리를 우회하고 /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 파일이 영향을 받을 수 있습니다.