TZ = UTC-8이 UTC + 8 인 날짜를 생성하는 이유는 무엇입니까?


25

로스 앤젤레스의 현재 시간은 18:05입니다. 그러나 내가 실행할 때 나는 TZ=UTC-8 date --iso=ns얻는다 :

2013-12-07T10:05:37,788173835+0800

날짜 유틸리티는 시간이 10:05이며 UTC + 8 로보 고한다고 말합니다. 왜?

답변:


33

그 이유는 POSIX 시간대TZ=UTC-8 로 해석되기 때문입니다 . POSIX 시간대 형식에서 3 개의 문자는 시간대 약어 (임의의 임의)이며 숫자는 시간대가 UTC 보다 뒤에있는 시간 수입니다 . 따라서 "UTC"라는 표준 시간대는 실제 UTC보다 -8 시간 또는 UTC + 8 시간입니다.UTC-8

(UNIX가 UTC보다 뒤에있는 미국에서 개발 되었기 때문에 그렇게 작동합니다.이 형식을 사용하면 미국 시간대를 EST5, CST6 등으로 나타낼 수 있습니다.)

다음 예제에서 무슨 일이 일어나고 있는지 알 수 있습니다.

$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800

ISO -0800표준 시간대 형식은 -영역이 UTC보다 뒤에 있고 +해당 영역이 UTC보다 앞서 있음 을 나타내는 반대 접근 방식을 취합니다 .


아 정말 내가 원했던 것은 TZ=PST+8 date. 감사. 또한 아래의이 설명을 발견 man timezone. 성병 문자열이 시간대의 이름을 지정하고 세 개 이상의 알파벳 문자해야한다 "오프셋 문자열은 즉시 세계시를 (협정 얻기 위해 현지 시간에 추가 할 표준 및 지정 시간 값을 다음과 같습니다 : UTC). 현지 시간대가 프라임 자오선 서쪽이면 동부 표준시 오프셋이고 양수가 동쪽이면 음수입니다. 시간은 0과 24 사이, 분과 초는 0과 59 사이 여야합니다. "
Alex Henrie

3
@Alex 아니요, 정말로 원하는 것은 TZ=America/Los_Angeles입니다. 일광 절약 시간제 동안 태평양 시간이 -7이라는 것을 잊고 있습니다.
Matt Johnson-Pint

3
@MattJohnson, 당신은 의미 TZ=:America/Los_Angeles합니다. 콜론은 그것이 Olson 시간대 파일임을 나타냅니다. 그리고 또 다른 의견에서 그는 일광 절약 시간제를 무시하고 싶었지만 언급하지 않았습니다.
CJM

@ cjm, 고마워, 당신은 콜론에 대해 옳고 그 의견을 보지 못했습니다.
Matt Johnson-Pint

우리가 세상에 존재해야한다면 세상을 원하게 EST-5 CST-6하세요.
Evan Carroll

7

+/- 00:00 형식으로 시간대를 지정할 때마다 실제 시간대가 아닌 오프셋을 지정 합니다. 로부터 GNU libc 문서 (POSIX 표준을 따른다)

오프셋은 협정 세계시 값을 얻기 위해 현지 시간에 추가해야하는 시간 값을 지정합니다. [+ |-] hh [: mm [: ss]]와 같은 구문이 있습니다. 현지 시간대가 Prime Meridian 서쪽이면 긍정적이고 동쪽이면 부정적입니다. 시간은 0과 23 사이, 분과 초는 0과 59 사이 여야합니다.

이것이 기대했던 것과 반대되는 이유입니다.


2

Why?

POSIX가 필요 하기 때문에 .

앞에 '-'가 붙는 시간대는 프라임 자오선의 동쪽입니다. 그렇지 않으면 서쪽이되어야합니다 (선택적인 선행 '+'로 표시 될 수 있음).

따라서 이것은 [1] 근처에 시간을 줄 것입니다 Los Angeles(시간대 텍스트의 경우 3 글자 레이블 사용).

$ TZ=ANY8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 ANY-0800

$ TZ=GMT+8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 10:47:12 GMT-0800

그리고 이것은 Shanghai, China또는 근처에 시간을 주어야합니다 Perth, Australia:

$ TZ=ANY-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-24 02:47:12 ANY+0800

$ TZ=CST-8 date "+%Y-%m-%d %H:%M:%S %Z%z"
2016-04-23 02:47:12 CST+0800

[1] 실제 "현지 시간"을 변경하는 DST (일광 절약 시간제)가있을 수 있기 때문에 가까이에 있습니다.


1

다른 방법 zdump으로이 명령 을 사용하여 다른 시간대 + 오프셋으로 현재 시간을 표시 할 수 있습니다 .

Zdump는 명령 줄에 이름이 지정된 각 영역 이름으로 현재 시간을 인쇄합니다.

시간대에도 동일한 규칙이 적용됩니다. 주요한 자오선의 서쪽은 "뒤에"있고 동쪽은 "앞에"있습니다.

$ zdump PST PST 토요일 12 월 7 일 03:25:27 2013 PST

이 스크립트를 사용하여 우리가 사용 zdump하고 싶은 시간대 + 오프셋 중 일부를 표시하여 date비교할 수 있도록했습니다.

$ cat cmd.bash
#!/bin/bash

printf "\ndate: %s\n\n" "$(date)"

for tz in EST PST PST+8 PST-8 UTC UTC+8 UTC-8; do
  echo "-- timezone $tz"
  printf "zdump: %s\n" "$(zdump $tz)"
  printf "date:         %s\n" "$(TZ=$tz date +'%a %b %d %T %Y - (%Z %z)')"
  echo ""
done

당신이 그것을 실행하면 다음 당신은의 비교를 볼 수 있습니다 zdump로를 date:

$ ./cmd.bash 

date: Sat Dec  7 02:59:05 EST 2013

-- timezone EST
zdump: EST  Sat Dec  7 02:59:05 2013 EST
date:         Sat Dec 07 02:59:05 2013 - (EST -0500)

-- timezone PST
zdump: PST  Sat Dec  7 07:59:05 2013 PST
date:         Sat Dec 07 07:59:05 2013 - (PST +0000)

-- timezone PST+8
zdump: PST+8  Fri Dec  6 23:59:05 2013 PST
date:         Fri Dec 06 23:59:05 2013 - (PST -0800)

-- timezone PST-8
zdump: PST-8  Sat Dec  7 15:59:05 2013 PST
date:         Sat Dec 07 15:59:05 2013 - (PST +0800)

-- timezone UTC
zdump: UTC  Sat Dec  7 07:59:05 2013 UTC
date:         Sat Dec 07 07:59:05 2013 - (UTC +0000)

-- timezone UTC+8
zdump: UTC+8  Fri Dec  6 23:59:05 2013 UTC
date:         Fri Dec 06 23:59:05 2013 - (UTC -0800)

-- timezone UTC-8
zdump: UTC-8  Sat Dec  7 15:59:05 2013 UTC
date:         Sat Dec 07 15:59:05 2013 - (UTC +0800)

실제로 일광 절약 시간을 무시하고 태평양 표준시로 현재 시간을 가져 오려고합니다.
Alex Henrie

1
"UTC-8"이 틀렸다고 추측하고 있기 때문에 이것을 다운 보트해야했습니다. 맞습니다, 그것은 단지 사용자가 기대하는 것을하지 않습니다. 나는 그것이 왜 그렇게 작동하는지에 대한 질문에 대답한다고 생각하지 않습니다.
jordanm

@jordanm-정리를 참조하십시오.
slm

1
여전히 어떤 일이 일어나고 있는지, 왜 그런지 설명하지 않고 OP가 요구하는 것은 "왜"입니다. 나는 downvote를 제거 할 것이지만 여전히 그것이 질문에 대한 좋은 대답이라고 생각하지 않습니다.
jordanm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.