내 구역 정보가 거꾸로 되어 있는 걸까요, 아니면 혼란스러운 걸까요?

내 구역 정보가 거꾸로 되어 있는 걸까요, 아니면 혼란스러운 걸까요?

내가 아는 한, 미국 동부 표준시는 GMT-5 동부 표준시이고 GMT-4 동부 일광 절약 시간입니다.

그렇다면 이 두 명령이 답변에 서로 다른 시간을 제공하는 이유는 무엇입니까?

laptop % TZ=EST5EDT date
Wed Apr 27 12:16:36 EDT 2022
laptop % TZ=GMT-4 date
Wed Apr 27 20:16:40 GMT 2022

그들은 동일해야 하지 않나요?

답변1

실제로 TZ 변수를 사용하는 두 가지 주요 방법이 있습니다. 이전 버전은 POSIX 표준에 지정되어 있으며 실제 변수에서 현재 연도의 시간대 및 일광 절약 시간 규칙을 인코딩합니다. 예를 들어 유럽 UTC+2시간 시간대는 다음 POSIX 스타일로 완전히 지정될 수 있습니다.

TZ=EET-2EEST,M3.5.0/3,M10.5.0/4
  • EET = "표준시" 시간대 ID("동유럽 표준시")
  • -2 = 오프셋되어야 함UTC를 얻으려면 현지 시간을 추가하세요.
  • EEST = DST 시간대 ID("동부 유럽 서머타임")
  • M3.5.0/3 = 현지 시간으로 3월 마지막 일요일 03:00:00에 DST가 적용됩니다.
  • M10.5.0/4 = 10월 마지막 일요일, 현지 시간 04:00:00에 표준 시간이 재개됩니다.

이 형식은 현재 연도의 일광 절약 시간 규칙이 과거 및 미래 연도에도 적용된다고 가정합니다. 이는 정확할 가능성이 거의 없습니다.

이는 분명히 이상적이지 않기 때문에 많은 UNIX 스타일 운영 체제는 TZ 환경 변수를 특정 시간대의 현재 및 과거 정의를 다루는 보다 확장된 시간대 정보 테이블에 대한 참조로 사용합니다.

이러한 테이블 기반 구현 중 가장 포괄적인 것은 Olson Time Zone Information Database입니다.IANA에서 관리함. Olson 스타일의 TZ 값은 일반적 <Continent>/<City>으로 형식이 지정되지만 데이터베이스에는 다른 옵션도 있습니다. TZ 변수에는 두 가지 형식 중 하나를 사용할 수 있지만 값이 모호한 경우 POSIX 형식이 우선합니다.확립된 표준.

TZ 변수의 POSIX 표준 정의는 자연스럽게 가정하는 것과 "반대"입니다. 첫 번째 시간대 라벨 뒤의 숫자는 시간대에 추가해야 하는 시간을 나타냅니다.현지 시각얻기 위해서는UTC.

이는 POSIX 표준이 개발되기 전에 다양한 버전의 TZ 환경 변수 규칙이 존재했기 때문일 수 있습니다. Unix는 원래 서반구에서 개발되었기 때문에 기존 규칙에서는 미국 시간대를 표시하기 위해 양수를 사용하는 경향이 있었습니다. (Unix 초기에는 MULTICS 운영 체제 개발 프로젝트의 학문적 파생물이 더 크고 영구적인 프로젝트로 발전할 것이라고는 누구도 상상하지 못했을 것입니다.)

내가 아는 한, POSIX 사양 개발자들은 그렇게 하지 말아야 할 매우 명백한 이유가 없는 한 이미 가장 일반적인 동작을 찾아서 표준으로 코드화하기 위해 최선을 다합니다.

따라서 TZ=GMT-4POSIX 스타일로 설명하자면... "GMT에서 4시간 시간대를 뺀 것"을 의미하는 것이 아니라 실제로는 "4시간 시간대"를 의미합니다.UTC보다 앞서그리고명명 된내 생각에는 원하는 대로 사용자 정의 시간대를 호출할 수 있지만, 완전히 다른 것에 대해 잘 알려진 과거 시간대 식별자를 재사용하면 혼란이 발생할 수 있습니다.

Linux에서 "GMT"만으로 시간대를 지정하려면 접두사를 추가하여 최신 Olson 스타일 TZ 설정을 사용해야 합니다 Etc/. 심지어 부호 규칙은 예상한 것과 반대입니다. 아마도 POSIX 스타일 설정의 오래된 비유를 유지하기 위한 것입니다.

비교하다:

$ TZ=Etc/GMT-4 date
Wed 27 Apr 21:09:32 +04 2022     # Olson: 4 hours east of UTC, timezone correctly identified numerically 
$ TZ=GMT-4 date
Wed 27 Apr 21:09:50 GMT 2022     # POSIX: 4 hours east of UTC, misleading timezone identifier!
$ TZ=Etc/GMT+4 date
Wed 27 Apr 13:09:39 -04 2022     # Olson: 4 hours west of UTC, timezone correctly identified numerically
$ TZ=GMT+4 date  
Wed 27 Apr 13:10:14 GMT 2022     # POSIX: 4 hours west of UTC, misleading timezone identifier!
$ date -u
Wed 27 Apr 17:10:25 UTC 2022     # UTC time for reference.

관련 정보