Ubuntu 18.04에서는 다음과 같은 동작이 발생합니다 date
.
$ date --version | head -n1
date (GNU coreutils) 8.28
$ date
Вт окт 8 13:18:18 MSK 2019
$ TZ=UTC date
Вт окт 8 10:18:23 UTC 2019
여태까지는 그런대로 잘됐다. 하지만 이제 Raspbian 9에서도 동일한 작업을 수행하려고 합니다.
$ date --version | head -n1
date (GNU coreutils) 8.26
$ date
Tue Oct 8 13:18:50 MSK 2019
$ TZ=UTC date
Tue Oct 8 13:18:51 MSK 2019
date
Raspbian 버전이 환경 변수를 무시하는 이유는 무엇일까요 TZ
?
답변1
두 가지 가능한 이유를 생각해 볼 수 있습니다.
이 파일은
/usr/share/zoneinfo/UTC
Raspbian 9에 존재하지 않거나 손상되었으므로glibc
TZ 변수 설정 및 시스템 기본 시간대로 대체할 수 없습니다.읽기 전용으로 표시된 이전에 구성한 TZ 변수가 있을 수 있으므로 이를 변경하려고 해도 적용되지 않습니다.
답변2
$TZ
일년 내내 표준시(0에서 오프셋)인 UTC라는 시간대로 정의하는 정확하고 표준적이며 이식 가능한 방법은 다음과 같습니다.
TZ=UTC0
이는 독립적이며 해당 시간대의 전체 사양을 제공합니다. 이는 UTC로부터의 오프셋이 0(DST 부분이 지정되지 않았기 때문에 연중 내내 유효함)이고 레이블(보고된 대로 date +%Z
)이 UTC임을 나타냅니다.
설명된 시간대 사양은 TZ
DST 이름과 오프셋은 물론 일광 절약 시간과 겨울 시간 사이를 변경하는 시기에 대한 규칙도 포함할 수 있으므로 더 복잡해질 수 있습니다. 그러나 이러한 규칙은 제한적이며 특히 규칙이 해마다 변경되는 상황은 다루지 않습니다(그리고 대부분의 국가에서 규칙은 시간이 지남에 따라 변경되거나 특정 달의 1일과 함께 사용됩니다. 또는 마지막). 일요일(다른 규칙).
그렇기 때문에 POSIX는 구현이 실제 시간대를 정의하는 더 나은 방법을 찾을 수 있도록 왼쪽 구현 정의를 처리하는 TZ=:something
방법 도 지정합니다.something
대부분의 시스템에서 이는 다음을 사용하여 수행됩니다.ICANN의 tz 데이터베이스(또한 이러한 문제를 처리하는 참조 코드도 게시합니다.)
TZ=:Europe/London
따라서 예를 들어 올해와 지난 몇 년 동안 런던의 시간대 오프셋과 변경 시간을 다루는 영국 대륙 시간대를 사용할 수 있습니다 .
실제로 는 일부 디렉터리 (일반적으로 ) Europe/London
에 대한 상대 파일 경로로 해석됩니다 .zoneinfo
/usr/share/zoneinfo
Etc/UTC
tz 데이터베이스에는 파일 Etc/Universal
과 해당 링크가 포함된 파일 도 있습니다 Etc/Zulu
. Etc/GMT
같은 방식으로 정의되지만 레이블은 일년 내내 GMT입니다( Etc/GMT-0
, Etc/GMT+0
, Etc/Greenwich
링크를 사용).
따라서 시스템이 가장 간단한 TZ 규칙(일년 내내 UTC에서 0 오프셋)을 찾기 위해 파일을 열어야 한다는 점을 제외하면 TZ=:Etc/UTC
UTC와 동일한 효과를 얻습니다 .TZ=UTC0
Etc/UTC
UTC
많은(대부분?) 시스템에는 -> 심볼릭 링크 가 있으므로 Etc/UTC
이를 수행할 수 있습니다 TZ=:UTC
.
TZ=UTC
POSIX 자체는 아니지만 오프셋이 없으면 대부분의 시스템에서 동일하게 해석됩니다 TZ=:UTC
( 에서 시간대 정의를 찾으세요 /path/to/zoneinfo/UTC
). 하지만 tz 데이터베이스를 사용할 수 없으면 작동하지 않습니다.
또한 특히 이 옵션을 사용하면 내용에 관계 없이 UTC 날짜를 가져올 date
수 있습니다. .-u
$TZ
date -u
TZ=UTC0 date