如何更改date命令的时区字符串?

如何更改date命令的时区字符串?

我很好奇如何更改命令显示的时区缩写date。让时区不变,但是CST下面如何更改为UTC+8

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

谢谢你!

PS 1.操作系统是ubuntu 22.04

PP 2. 我的时区是 Asia/Taipei,因此 date +%Z 的结果是 CST。不过我认为这个缩写很混乱,因此希望它显示为 UTC+8。

PS 3.我尝试了一个解决方法,将时间更改为亚洲/新加坡。是的,日期+%Z的结果是+08。但我真的不想改变时区。

答案1

export TZ='<UTC+8>-8'可以将当前时区定义为已命名的UTC+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 源代码包时,您都需要重做(这种情况一年会发生好几次,例如,任何国家/地区的任何政府决定新的 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

相关内容