내 시스템(Debian 테스트의 Gnome 3)이 현재 시간을 혼동합니다. 실행해 보니 date
시간은 제대로 표시되는데 일부 앱은 1시간씩 늦게 나오네요. 예를 들어 Gnome 캘린더에 이벤트를 추가하면 캘린더 약속에 표시되는 이벤트 시간은 내가 입력한 시간에서 1시간을 뺀 시간이 됩니다.
문제를 발견했지만 해결 방법을 모르겠습니다.
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 11:25:37 BST 2017
Sun 30 Apr 10:25:37 GMT 2017
Sun 30 Apr 10:25:37 BST 2017
출력의 처음 두 줄은 정확하고 세 번째 줄은 한 시간 늦었습니다. 내가 이해하지 못하는 것은 왜 BST 시간대가 한 시간 뒤쳐져 있는 것처럼 보이는 동시에 현재 시간은 정확하며 BST를 사용한다는 것입니다.
이는 또한 관련이 있을 수 있습니다:
$ timedatectl status
Local time: Sun 2017-04-30 11:33:07 BST
Universal time: Sun 2017-04-30 10:33:07 UTC
RTC time: Sun 2017-04-30 10:33:07
Time zone: Europe/London (BST, +0100)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
편집하다 zdump /etc/localtime의 출력:
$ zdump /etc/localtime
/etc/localtime Sun Apr 30 12:22:53 2017 BST
$ date ; TZ=GMT date ; TZ=BST date
Sun 30 Apr 12:22:53 BST 2017
Sun 30 Apr 11:22:53 GMT 2017
Sun 30 Apr 11:22:53 BST 2017
답변1
BST
시간대 이름으로 인식되지 않습니다. 출력에서 약어로 사용되지만 시간대를 지정하는 데 사용할 수는 없습니다. 대부분의 프로그램은 시간대 이름을 확인하지 않으며 시간대 이름이 인식되지 않으면 기본적으로 GMT로 설정됩니다.
BST, CET, EST와 같은 약어는 항상 명확하게 정의되지 않으며 때로는 모호하기도 합니다(북미 표준시입니까 아니면 호주 동부 표준시입니까?). 시간대 구성은 일반적으로 전 세계적으로 사용되는 반면, 특정 지역 내에서만 의미가 있습니다. 또한 BST와 같은 약어는 실제로 시간대를 지정하지 않고 시간대(일광 절약 시간이 적용되는 영국)의 시간만 지정합니다. 따라서 대부분 대륙/도시 패턴을 따르는 명확한 이름을 사용해야 합니다. 일반적인 Linux 시스템에서 그리고 다른 많은 Unix 변형에서도 이것이 사실이라고 생각합니다. 디렉토리를 보면 어떤 약어가 사용 가능한지 알 수 있습니다 /usr/share/zoneinfo
.
GMT
따라서 BST
겨울과 여름에는 사용하는 대신 Europe/London
.
답변2
date
@Gilles가 말했듯이 BST는 사용자에게 이것이 영국 서머타임 날짜(GMT+1)임을 알려주는 출력 date +%Z
이며 시간대를 정의하는 것이 아니며 $TZ
.
BST는 영국 사용자에게 큰 의미가 있습니다. 영국 사용자는 이 내용을 보면 14:00 BST
타임스탬프가 영국 대륙 일광 절약 시간 14시(예: 13:00 UTC)를 의미한다는 것을 알 수 있습니다. 이러한 3~4자 코드는 영국, 미국 및 일부 기타 영어권 국가에서 널리 사용되므로 이러한 국가( 예: 지역 설정) date
의 기본 출력 에 나타납니다. en_GB.UTF-8
반면에 대부분의 프랑스 사용자는 그것이 무엇을 의미 14:00 CEST
하는지 전혀 모릅니다.CEST
중앙 유럽 서머타임CET
, 프랑스 여름의 경우 GMT+2), 따라서 날짜가 시간대를 지정할 때 / CEST
거기(에서와 같이 ) 보다 UTC 오프셋을 포함하는 것이 더 낫다는 것을 알 수 있습니다 mardi 2 mai 2017, 13:34:09 (UTC+0200)
.
이 $TZ
변수에는 3~4자의 문자 코드가 포함되지 않습니다. 뭔가가 들어있어요정의/지정하다시간대, 지역. 이는 겨울과 여름 시간 사이를 전환하는 시점, 겨울 시간과 여름 시간을 사용자에게 표시하는 코드(있는 경우)를 알기 위해 응용 프로그램에서 UTC로부터의 오프셋을 아는 데 사용됩니다(중요한 사용자의 경우). 사용자).
TZ
특정 시스템에 대해 정의된 시간대 사양을 설정하여 이를 수행할 수 있습니다 . TZ=:Europe/London
(많은 시스템에서도 이를 허용하지만 ) TZ=Europe/London
또는 TZ
완전한 규칙을 포함합니다(제한적임).
예를 들어 TZ=:Europe/London
내 시스템에서 사용하면 시스템에서 규칙이 읽혀집니다 /usr/share/zoneinfo/Europe/London
.
예를 들어, 파일은 1996년부터 10월 마지막 일요일 오전 2시(UTC)부터 3월 마지막 일요일("그리니치 표준시"를 의미하는 GMT)까지의 UTC 오프셋을 0으로 지정하고, 그렇지 않은 경우 1(BST)로 지정합니다. , 이는 "British Summer Time"을 나타냄), 1970년(0 Unix 시간)부터 1972년까지 전체 연도는 1이고 BST라는 이름은 "British Summer Time"을 나타냅니다.기준시간".
이미 볼 수 있듯이 BST를 시간대 사양으로 사용하는 것은 의미가 없습니다. 첫째, 시점에 따라 의미가 달라지며, 현재 시대만 고려하더라도 썸머타임에 대한 코드일 뿐이므로 연중 내내 타임존 사양으로 사용할 수는 없습니다.
TZ
이제 완전한 규칙을 포함할 수도 있습니다 . 예를 들어, 1970년대 초반 영국 표준시(여름이 아닌) 시간의 경우 가장 간단한 정식 형식을 사용할 수 있습니다.
TZ=BST-1
항상 UTC에서 동쪽으로 1시간 떨어진 시간대를 지정하고 date +%Z
항상 반환됩니다 BST
. 이 시간대는 1970년대 초 영국 본토에 적합하고 1972년 이후 여름 시간에는 정확하지만 1972년 이후 겨울 시간에는 정확합니다(우리는 미래를 예측할 수 없습니다).
또는 현재 규칙의 전체 사양을 사용할 수 있습니다.
TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
이는 연도에 두 개의 기간이 있음을 의미합니다. 하나는 GMT라는 이름과 오프셋 0을 갖고, 다른 하나는 BST라는 이름과 오프셋 1을 갖습니다(지정되지 않은 경우 +1과 같이 암시적으로 0입니다). , 한 기간에서 다른 기간으로의 전환은 3월(3)의 마지막(5) 일요일(0) UTC 1:00:00에 이루어지며 10월 마지막 일요일 2:00이 반환됩니다.
다시 말하지만, TZ는 1996년부터 시행되었지만 반드시 효과적인 것은 아닙니다. 예를 들어 1970-01-01 00:00:00 UTC(0 Unix epoch 시간, 런던 현지 시간은 1:00:00 BST(영국 표준시))의 경우:
$ TZ=:Europe/London date -d @0
Thu 1 Jan 01:00:00 BST 1970
$ TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00 date -d @0
Thu 1 Jan 00:00:00 GMT 1970
POSIX에 따르면,행동
TZ=BST-1
잘 정의됨(위에서 언급한 대로)TZ=BST
(또는TZ=GMT
/TZ=UTC
/TZ=Europe/London
)가 지정되지 않았습니다.TZ=:BST
/TZ=:Europe/London
예구현 정의. 즉, 시스템은 이를 지원하고 수행하는 작업을 문서화하도록 설계되었지만 POSIX는 해당 시스템이 수행하는 작업을 알려주지 않습니다.
위의 세 번째 경우에서 GNU 시스템(및 대부분의 다른 Unix 계열 시스템이라고 생각함)에서 TZ
로 시작할 때 :
다음 내용은 시간대 정의 파일의 경로로 처리됩니다. GNU 시스템의 경우 생략된 경우에도 마찬가지입니다 :
(값이 유효한 시간대 사양을 형성하더라도 UTC0
이러한 파일은 일반적으로 존재하지 않아야 합니다. 하지만 내 시스템에서 몇 가지 예외를 볼 수 있으므로 POSIX가 아닌 파일이 됩니다). 시스템(예: file1 이 정의 되어 있기 때문에 TZ=CST6CDT date -d 1943-01-01 +%Z
출력이 출력 CWT
되지 않습니다.CST
/usr/share/zoneinfo/CST6CDT
전시그 기간 동안)).
경로는 일반적으로 상대 경로이며, 이 경우 상대 경로입니다 (또는 $TZDIR
정상적으로 설정되지 않은 /usr/share/zoneinfo
경우 일부 기본값 과 같습니다). 보안상의 이유로 구성 요소가 있는 절대 또는 상대 경로는 $TZDIR
권한 에스컬레이션 컨텍스트(예: setuid 컨텍스트)에서 무시됩니다 .$TZDIR
..
따라서 일반적으로 GNU 시스템에서 는 TZ=:BST
일반적으로 파일을 찾는 것과 같습니다. 찾을 수 없는 경우(시간대 정의를 식별하는 것이 불가능하기 때문에) 일반적으로 UTC 시간 및 시간대 이름(출력에 표시됨)을 가정합니다.TZ=BST
/usr/share/zoneinfo/BST
BST
date +%Z
BST
1 , , ... CST6CDT
같은 것들은 모두 다른 시대의 잔재입니다. 1993년 말에 TZ 데이터베이스(현재WET
CET
MET
IANA에서 관리함)변경됨MET
임시(그리고 종종 모호한) 이름(예: , GB-Eire
, ) 을 사용하는 것부터 해당 도시가 (출판 당시) 가장 인구가 많은 도시 WET
라는 사실까지 해당 지역이 적용됩니다(지역은 다음과 같은 넓은 지역입니다). Area/City
대륙/해양). 영국 본토의 경우 (WET 아님)을 사용했지만 GB-Eire
지금은(1993년부터) 이전 버전과의 호환성을 위해 Europe/London
. GB-Eire
(예: WET
)을 계속 사용할 수 있습니다( GB-Eire
현재는 에 연결되어 있지만 Europe/London
지역 WET
은 겨울에 UTC 및 EU DST 규칙을 사용하도록 정의되어 있습니다(영국). 1996년부터 EU 규칙만 따랐고 영국은 이제 EU를 떠났으며 미래가 어떻게 될지는 아무도 말할 수 없습니다.)) 그러나 지금은 새로운 배포에 사용해서는 안 됩니다.
답변3
Giles의 답변에 추가하려면 OP와 동일한 시간대에 있습니다. 서유럽 시간(Western European Time)이라고도 하며 WET
, 포르투갈은 내가 정확하게 기억한다면 1996년경에 유닉스 시간대에 포함되었습니다.
https://en.wikipedia.org/wiki/Western_European_Time
유럽 표준시(WET, UTC ±00:00)는 서부 및 북서부 유럽의 일부 지역을 포함하는 시간대입니다.
다음 국가 및 지역에서는 겨울에 WET를 사용합니다.
- 카나리아 제도, 1946년 이후(나머지 스페인은 CET, UTC+1임) - 페로 제도, 1908년 이후
- 그린란드 북동부(덴마크 항구 및 주변 지역) )
- 아이슬란드, 1968년 이후
- 포르투갈, 1912년 이후 유예(아조레스 제도 제외, UTC−1) [1]
- 마데이라, 1912년 이후 유예 [2]
- 아일랜드, 1916년 이후(법적으로 그리니치 표준시로 알려짐), 1968년과 1971년 사이 제외
- 영국 1847년부터 잉글랜드, 스코틀랜드, 웨일스, 채널 제도 및 맨 섬에서, 1916년부터 북아일랜드(법적으로 그리니치 표준시로 알려짐)에서 시작하여 일시 중지됨영국에서는 1940년부터 1945년까지 겨울에 영국 서머타임(BST=CET)을 사용했고, 1941년부터 1945년과 1947년까지 여름에는 영국 이중 일광 절약 시간(BDST=CEST)을 사용했다. BST는 1968년 2월 18일부터 1971년 10월 31일까지 일년 내내 사용되었습니다.
아이슬란드를 제외하고 위에 언급된 국가들은 모두 여름에 일광 절약 시간제를 실시하고 WET보다 1시간 빠른 서유럽 서머타임(WEST, UTC+1)으로 전환합니다. WEST는 영국에서는 영국 서머타임(British Summer Time)으로 알려져 있으며, 아일랜드에서는 공식적으로 아일랜드 표준시(Irish Standard Time)로 알려져 있습니다.
일광 절약 시간의 공식 명칭은 WEST(Western European Daylight Saving Time)이며, 한 시간 빠른 일광 절약 시간/일광 절약 시간을 고려하여 WET
사용됩니다 .TZ
요즘에는 "유럽/런던"이 더 나은 선택일 수 있지만 WET
약어를 아는 것이 일부 상황에서는 여전히 유용할 수 있습니다.
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
따라서 결과를 초기 테스트와 비교하십시오.
$date ; TZ=GMT date ; TZ=WET date
Mon May 1 09:36:10 WEST 2017
Mon May 1 08:36:10 GMT 2017
Mon May 1 09:36:10 WEST 2017