내 BST 시간대가 한 시간 늦나요?

내 BST 시간대가 한 시간 늦나요?

내 시스템(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 계열 시스템이라고 생각합니다)에서 TZa로 시작 하면 :뒤에 오는 내용이 시간대 정의 파일의 경로로 사용됩니다. 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 데이터베이스(현재WETCETMETIANA에서 관리)변경됨임시(그리고 대부분 모호한) 이름(예: 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

관련 정보