Solaris에서 시간대 오프셋을 사용할 때 date 명령에서 이상한 동작이 발생합니다.
>echo $TZ
MET
>date
Wed Mar 31 11:41:45 MEST 2021
>TZ=MET+24 date
Tue Mar 30 09:42:06 MET 2021
>TZ=MEST+24 date
Tue Mar 30 09:42:52 MEST 2021
TZ가 MET로 설정된 경우 날짜 출력에 MEST가 표시되는 이유와 TZ+24가 두 시간대 모두에서 24시간 대신 26시간 오프셋을 표시하는 방법입니다.
답변1
따라서 왜 이런 일이 발생하는지 이해하고 싶습니다(단순화).
$ TZ=MET date; TZ=MET+0 date
Tue 01 Jun 2021 06:00:00 AM MEST
Tue 01 Jun 2021 04:00:00 AM MET
MET
즉, 와 의 차이는 2시간입니다 MET+0
.
이 문제를 디버깅하는 가장 쉬운 방법은 '+%z'
서식을 추가하는 것입니다. 결과를 인쇄하는 데 사용된 날짜 오프셋을 인쇄하고 문제가 있는 위치를 디버깅하는 데 도움이 될 수 있습니다.
$ TZ=MET date "+%c %z"; TZ=MET+0 date "+%c %z"
Wed 31 Mar 2021 06:11:16 PM MEST +0200
Wed 31 Mar 2021 04:11:16 PM MET +0000
-2
이는 날짜가 오프셋과 오프셋 결과를 인쇄하고 있음을 나타냅니다 +0
.
질문은 다음과 같습니다.왜?
아마도 TZ의 첫 번째 형식이 std offset
(TAG-03과 유사 했기 때문일 것입니다.)POSIX 참조)안에상표표준 영역의 범위를 정의하고 해당 레이블에 대한 선택적 오프셋을 제공합니다. 누락된 경우 오프셋이 가정됩니다 +0
.
따라서 MET를 MET로 설정 name
하고 오프셋을 +0으로 설정했습니다.
입증하다:
$ TZ=MET date "+%c %z"; TZ=METX+7:30 date "+%c %z"
Wed 31 Mar 2021 06:19:00 PM MEST +0200
Wed 31 Mar 2021 08:49:00 AM METX -0730
이것상표간단합니다. 인쇄할 시간대 이름입니다.
그러한 라벨에 사용되는 오프셋은 다음과 같습니다. ( -7:30
질문 없음)
METX
그러한 라벨은 어디에도 없으며 라벨에 7:30 오프셋도 없다는 점을 분명히 알 수 있습니다 .
이는 a가 라벨 과 어제의 오프셋을 MET+24
사용하여 시간대 시간을 인쇄하는 이유를 설명합니다 ( 원하는 경우 시도해 보세요) .MET
+0
+24
+12
올바른 TZ
우리는 TZ를 테스트할 수 있습니다설명하다표준 시간은 7시간이고 일광 절약 시간은 9시간입니다.MET-7MEST-9. 테스트하려면 다음을 인쇄하는 faketime(Solaris용으로 컴파일해야 함)이 필요합니다.
$ # In January (no DST):
$ faketime "1/1/21 12:00" bash -c 'date -u; TZ=MET date "+%c %z"'; \
faketime "1/1/21 12:00" bash -c 'TZ=MET-7MEST-9 date "+%c %z"'
Fri 01 Jan 2021 04:00:00 PM UTC
Fri 01 Jan 2021 05:00:00 PM MET +0100
Fri 01 Jan 2021 11:00:00 PM MET +0700
$ # In June (DST in effect)
$ faketime "6/1/21 12:00" bash -c 'date -u; TZ=MET date "+%c %z"'; \
faketime "6/1/21 12:00" bash -c 'TZ=MET-7MEST-9 date "+%c %z"'
Tue 01 Jun 2021 04:00:00 PM UTC
Tue 01 Jun 2021 06:00:00 PM MEST +0200
Wed 02 Jun 2021 01:00:00 AM MEST +0900
이는 단지 우리의 분석을 확인하기 위한 것입니다. TZ 값은 다음과 같이 줄일 수 있습니다.MET-7MESTDST의 기본 효과는 시간을 1시간 늘리는 것이기 때문입니다. 또한 MET의 실제 UTC 오프셋은 +1이므로 TZ는 다음과 같아야 한다고 결정할 수 있습니다.MET-1MEST. dst 마커( MET-1
)가 누락된 경우 dst 오프셋이 적용되지 않습니다.
당신을 위한 시간 목표 설정어제(+24시간) 다음을 사용해야 합니다.
TZ='MET+23MEST'
질문?
답변2
MET만으로는 분명히 중앙 유럽 표준시(=UTC+1시간)를 참조하며, 3월 마지막 일요일(올해 3월 28일)의 일광 절약 시간제 버전(UTC+2시간)으로 전환되어 DST 버전은 다음과 같이 알려져 있습니다. 중앙 유럽 표준시 여름 시간. 따라서 "MET"는 실제로 "MET-1MEST"의 약어로 해석됩니다. 2시간 총 UTC 차이는 1시간 시간대 기반 UTC 오프셋과 1시간 DST 오프셋에서 발생합니다.
이를 통해 이 명령을 입력할 때의 기본 UTC 시간이 대략 09:42 UTC임을 알 수 있습니다.
그러나 "MET+24"를 지정하면 "식별자 MET를 사용하고 (현지 시간) + 24시간 = UTC"가 되도록 UTC로 변환하는 이상한 시간대입니다. UTC를 현지 시간으로 변환하려면 공식이 역순으로 적용되므로 "MET+24 시간대의 현지 시간"은 UTC - 24시간 또는 정확히 전날의 UTC 시간입니다.
"MET+24"에는 DST 규칙이 없으므로 DST 수정이 적용되지 않습니다.