TZ = UTC-8이 UTC + 8 인 날짜를 생성하는 이유는 무엇입니까? 그러나 내가 실행할 때 나는 TZ=UTC-8 date

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

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

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



답변

그 이유는 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보다 앞서 있음 을 나타내는 반대 접근 방식을 취합니다 .


답변

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

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

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


답변

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 (일광 절약 시간제)가있을 수 있기 때문에 가까이에 있습니다.


답변

다른 방법 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)


답변