날짜 명령의 시간대 문자열을 변경하는 방법은 무엇입니까?

날짜 명령의 시간대 문자열을 변경하는 방법은 무엇입니까?

명령으로 표시되는 시간대 약어를 변경하는 방법이 궁금합니다 date. 시간대는 그대로 두는데, CST아래로 어떻게 바꾸나요 UTC+8?

clay@LAPTOP-3PP2093I:~$ date
Thu Dec  1 23:05:28 CST 2022

감사합니다!

추신 1. 운영 체제는 우분투 22.04입니다.

PP 2. 내 시간대는 Asia/Taipei이므로 날짜 +%Z의 결과는 CST입니다. 그러나 나는 이 약어가 혼란스럽다고 생각하며 UTC+8로 읽어줬으면 합니다.

PS 3. 시간을 아시아/싱가포르로 변경하여 해결 방법을 시도했습니다. 예, date+%Z의 결과는 +08입니다. 하지만 저는 시간대를 바꾸고 싶지 않습니다.

답변1

일년 내내 과거, 현재 및 미래 날짜에 대해 UTC보다 8시간 앞서 export TZ='<UTC+8>-8'명명된 현재 시간대를 정의할 수 있습니다 .UTC+8

그 다음에:

$ date +'%::z %Z'
+08:00:00 UTC+8
$ date
Thu  1 Dec 23:04:48 UTC+8 2022

Asia/Taipei시간대의 기록 변경 사항도 보존 하고 %Z반환된 내용을 변경하려면 해당 데이터가 파생된 tzdata를 수정하고 다시 컴파일해야 합니다.

apt source tzdata
sudo apt build-dep tzdata

대만 부분을 다음으로 변경합니다.

# Rule  NAME    FROM    TO  -   IN  ON  AT  SAVE    LETTER/S
Rule    Taiwan  1946    only    -   May 15  0:00    1:00    9
Rule    Taiwan  1946    only    -   Oct 1   0:00    0   8
Rule    Taiwan  1947    only    -   Apr 15  0:00    1:00    9
Rule    Taiwan  1947    only    -   Nov 1   0:00    0   8
Rule    Taiwan  1948    1951    -   May 1   0:00    1:00    9
Rule    Taiwan  1948    1951    -   Oct 1   0:00    0   8
Rule    Taiwan  1952    only    -   Mar 1   0:00    1:00    9
Rule    Taiwan  1952    1954    -   Nov 1   0:00    0   8
Rule    Taiwan  1953    1959    -   Apr 1   0:00    1:00    9
Rule    Taiwan  1955    1961    -   Oct 1   0:00    0   8
Rule    Taiwan  1960    1961    -   Jun 1   0:00    1:00    9
Rule    Taiwan  1974    1975    -   Apr 1   0:00    1:00    9
Rule    Taiwan  1974    1975    -   Oct 1   0:00    0   8
Rule    Taiwan  1979    only    -   Jul 1   0:00    1:00    9
Rule    Taiwan  1979    only    -   Oct 1   0:00    0   8

# Zone  NAME        STDOFF  RULES   FORMAT  [UNTIL]
# Taipei or Taibei or T'ai-pei
Zone    Asia/Taipei 8:06:00 -   UTC+8:06    1896 Jan  1
            8:00    -   UTC+8   1937 Oct  1
            9:00    -   UTC+9   1945 Sep 21  1:00
            8:00    Taiwan  UTC+%s

그런 다음 다음을 사용하여 새 패키지를 빌드합니다 tzdata.

dpkg-buildpackage -b

생성된 패키지를 설치합니다.

그 다음에:

$ export TZ=Asia/Taipei
$ date
Thu  1 Dec 23:17:41 UTC+8 2022
$ date -d 1979-08-01
Wed  1 Aug 00:00:00 UTC+9 1979
$ date -d 1892-06-01
Wed  1 Jun 00:00:00 UTC+8:6 1892

Ubuntu 소스 패키지를 업데이트할 때마다 이 작업을 다시 수행해야 하므로(1년에 여러 번 발생, 예를 들어 어떤 국가의 정부가 새로운 DST 변경 날짜나 규칙을 결정할 때) 실용적이지 않을 수 있습니다.

date의 출력에만 문제가 있는 경우 다음을 수행할 수도 있습니다.

$ date +"$(locale date_fmt | sed 's/%Z/UTC%:z/')"
Fri  2 Dec 00:31:05 UTC+08:00 2022

바꾸다

$ date
Fri  2 Dec 00:31:05 CST 2022

또는:

$ date +"$(locale d_t_fmt | sed 's/%Z/UTC%:z/')"
Fri 02 Dec 2022 00:33:02 UTC+08:00

바꾸다:

$ date +%c
Fri 02 Dec 2022 00:33:02 CST

그것들:

$ locale -k LC_TIME | grep fmt
d_t_fmt="%a %d %b %Y %T %Z"
d_fmt="%d/%m/%y"
t_fmt="%T"
t_fmt_ampm="%l:%M:%S %P %Z"
era_d_fmt=""
era_d_t_fmt=""
era_t_fmt=""
date_fmt="%a %e %b %H:%M:%S %Z %Y"

이는 기본 설정에 따라 새 로케일을 컴파일하여 변경할 수 있습니다.

localedef -i <(sed 's/%Z/UTC%z/g' /usr/share/i18n/locales/en_GB) \
          -f UTF-8 ~/.locales/en_GB.UTF-8@mytimezoneformat
export LOCPATH=~/.locales LC_TIME=en_GB.UTF-8@mytimezoneformat

(위의 내용은 내 홈 디렉토리에 설치되어 있지만 설정하지 않고도 시스템 전체에서 이 작업을 수행할 수도 있습니다 $LOCPATH.)

그 다음에:

$ date
Fri  2 Dec 01:11:16 UTC+0800 2022
$ date +%c
Fri 02 Dec 2022 01:11:20 UTC+0800

관련 정보