
내 시스템(Debian Testing의 Gnome 3)이 현재 시간을 혼동합니다. 실행하면 date
시간이 올바르게 표시되지만 일부 응용 프로그램은 시간보다 1시간 늦습니다. 예를 들어, Gnome Calendar에 이벤트를 추가하면 캘린더 약속에 표시되는 이벤트 시간은 내가 입력한 시간에서 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는 / 에 출력되는 것이며 date +%Z
사용자에게 시간대를 정의하는 것이 아니라 사용할 수 있는 것이 아니라 영국 서머타임 날짜(즉 GMT+1)임을 알리기 위한 것입니다 $TZ
.
해당 BST는 영국 사용자에게 중요합니다. 영국 사용자가 를 보면 14:00 BST
타임스탬프가 영국 본토의 여름 시간 14시(즉, 13:00 UTC)를 의미한다는 것을 알 수 있습니다. 3-4자 코드의 사용은 영국, 미국 및 기타 영어권 국가에서 널리 사용되므로 date
해당 국가의 기본 출력에 표시됩니다( en_GB.UTF-8
예: 로케일). 반면에, 대부분의 프랑스어 사용자는 14:00 CEST
(비록 CEST
다음을 참조 하더라도 ) 무슨 뜻인지 전혀 모릅니다.중앙 유럽 서머타임, 프랑스 여름에 적용되는 GMT+2), 따라서 날짜가 시간대를 지정할 때 CET
/ CEST
거기(예: mardi 2 mai 2017, 13:34:09 (UTC+0200)
)보다 UTC 오프셋을 포함한다는 것을 알 수 있습니다.
변수 $TZ
에는 3~4자의 문자 코드가 포함되지 않습니다. 여기에는 다음과 같은 내용이 포함되어 있습니다.정의하다/지정하다시간대, 현재 위치. 애플리케이션은 이를 사용하여 특정 시점의 UTC와의 오프셋, 겨울과 여름 시간 사이를 전환할 시기, 겨울과 여름 시간에 대한 코드(있는 경우)가 표시되는 내용을 파악합니다. 사용자에게(중요한 사용자의 경우)
TZ
이를 위해 시스템 정의 시간대 사양을 설정할 수 있습니다 . 유사 TZ=:Europe/London
(많은 시스템도 허용하지만 TZ=Europe/London
) 또는 TZ
전체 규칙을 포함합니다(해당 규칙은 제한되어 있음).
예를 들어, 내 시스템에서 를 사용하면 TZ=:Europe/London
규칙은 에서 읽혀집니다 /usr/share/zoneinfo/Europe/London
.
예를 들어 해당 파일은 1996년 이후 UTC로부터의 오프셋이 10월 마지막 일요일 오전 2시(UTC)부터 3월 마지막 일요일까지 0("그리니치 표준시"를 의미하는 GMT 이름 사용)이고 그 외의 경우(이름 BST 사용)임을 지정합니다. "British Summer Time"의 경우), 1970년(0 Unix 시간)부터 1972년까지는 "British"의 경우 BST라는 이름으로 일년 내내 1번이었습니다.기준시간".
BST를 시간대 사양으로 사용하는 것이 의미가 없다는 것을 이미 알 수 있습니다. 첫째, 시점에 따라 의미가 달라지고, 현재 시대만 고려하더라도 여름 시즌에 대한 코드일 뿐이므로 1년 전체에 대한 시간대 지정으로 사용할 수는 없습니다.
TZ
이제 전체 규칙을 포함 할 수도 있습니다 . 예를 들어 70년대 초반의 "영국 표준시(여름 아님) 시간"의 경우 가장 간단한 형식의 지정을 사용할 수 있습니다.
TZ=BST-1
date +%Z
이는 항상 UTC에서 동쪽으로 1시간이고 항상 반환되는 시간대를 지정합니다 BST
. 해당 시간대는 70년대 초반 영국 본토와 1972년 이후 여름 시간에는 정확하지만 1972년 이후 겨울 시간에는 정확하지 않습니다(그리고 미래에 대해서는 알 수 없습니다).
또는 현재 규칙에 대한 전체 사양을 사용할 수 있습니다.
TZ=GMT0BST,M3.5.0/1:00:00,M10.5.0/2:00:00
이는 1년에 두 개의 기간이 있다는 것을 의미합니다. 하나는 이름이 오프셋 0의 GMT이고 다른 하나는 오프셋 1의 BST(지정되지 않은 경우 위의 0+1로 암시됨)이며, 여기서 다른 기간으로의 전환이 켜져 있습니다. 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
a로 시작 하면 :
뒤에 오는 내용이 시간대 정의 파일의 경로로 사용됩니다. GNU 시스템의 경우 가 생략된 경우에도 마찬가지입니다 :
(값이 와 같은 유효한 시간대 사양을 형성하더라도 UTC0
일반적으로 그러한 파일이 존재해서는 안 되지만 내 시스템에서 몇 가지 예외를 볼 수는 있습니다. POSIX 가 아닌 TZ=CST6CDT date -d 1943-01-01 +%Z
시스템 ( 예 CWT
:CST
/usr/share/zoneinfo/CST6CDT
전쟁 시간해당 기간 동안)).
해당 경로는 일반적으로 상대 경로입니다. 이 경우 상대 경로입니다 (또는 일반적인 경우와 같이 설정되지 않은 경우 $TZDIR
와 같은 일부 기본값 ). 보안상의 이유로 구성 요소 가 포함된 절대 경로 또는 상대 경로는 권한 에스컬레이션 컨텍스트(예: setuid 컨텍스트)에서 무시됩니다./usr/share/zoneinfo
$TZDIR
$TZDIR
..
따라서 일반적으로 GNU 시스템에서 는 TZ=:BST
일반적 으로 파일을 TZ=BST
찾습니다 /usr/share/zoneinfo/BST
. 찾을 수 없는 경우(시간대 정의를 식별할 수 없는 경우 BST
) 일반적으로 UTC 시간과 시간대 이름( 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 및 DST에 대한 EU 규칙을 사용하는 영역으로 정의됨(영국은 1996년부터 EU 규칙만 따르고 있으며 영국은 이제 EU를 탈퇴함). 미래가 어떻게 될지는 아무도 말할 수 없습니다)) 그러나 지금은 새로운 배포에 사용해서는 안 됩니다.
답변3
Gilles 답변 보완; 나는 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)이 여름에 사용되었습니다. 1968년 2월 18일부터 1971년 10월 31일까지 BST는 일년 내내 사용되었습니다.
아이슬란드를 제외한 위의 모든 국가에서는 여름에 일광 절약 시간제를 시행하여 WET보다 1시간 빠른 서유럽 서머타임(WEST, UTC+1)으로 전환합니다. WEST는 영국에서는 영국 서머타임(British Summer Time)이라고 하며, 아일랜드에서는 공식적으로 아일랜드 표준시(Irish Standard Time)로 알려져 있습니다.
서머타임의 공식적인 명칭은 WEST(Western European Summer Time)이지만, 는 서머타임/DST를 고려하여 1시간 앞당겨 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