阿毛
It's me !
想你所想
Linux date命令获取指定时区的时间

众所周知,Linux系统中,可以使用date命令获取当前时间。

阅读本文前,你需要先清楚这些名次的概念:
时区、UTC、GMT、常见的Asia/Shanghai、CST等。


如果我们想要获取某个时区的时间,该怎么办?

shell支持在date命令前,指定TZ参数,即指定时区,这样date输出将会输出指定时区的时间。TZ是timezone的缩写。

结合上面的实践过程,阐述下语法规则。

第一种规则

➜  ~ date
2020年10月21日 星期三 17时51分15秒 CST
➜  ~ TZ=0 date
2020年10月21日 星期三 09时51分20秒
➜  ~ TZ=8 date
2020年10月21日 星期三 01时51分23秒
➜  ~ TZ=-8 date
2020年10月21日 星期三 17时51分30秒
➜  ~ TZ=UTC+8 date
2020年10月21日 星期三 01时51分38秒 UTC
➜  ~ TZ=UTC-8 date
2020年10月21日 星期三 17时51分42秒 UTC
➜  ~ TZ=UTC0 date
2020年10月21日 星期三 09时51分58秒 UTC
➜  ~ TZ=CST0 date
2020年10月21日 星期三 09时52分10秒 CST
➜  ~ TZ= date
2020年10月21日 星期三 09时56分46秒 UTC
➜  ~ TZ=CST-8 date
2020年10月21日 星期三 18时16分28秒 CST
➜  ~ TZ=abcd-8 date
2020年10月21日 星期三 18时20分16秒 abcd

TZ=[***][+|-][***] date

[]中括号的内容均可以省略,第一个中括号内容为定义的时区字符,只能纯英文符,它会作为你自定义的时区名,任何字母字符组合都可以,下面会做解释。第二个中括号内容为“+”“-”符号,含义是早晚于UTC的小时数,“+”是早于,“-”是晚于,此处是逻辑上的大坑!!!! 第三个中括号内容即小时数。

现键入这样的内容,TZ=+8 date 或者 TZ=8 date 都会得到输出:在UTC时间上再减去8个小时后的时间,可见上面的实践过程,而不是我们常用的“UTC+8”时间!!!TZ会解析正数还是负数,不带“+”或者带“+”为正,“-”为负数,切记对应语义是早于(+)还是晚于(-),并且它在计算时,仅以UTC为准,即在UTC标准时间基础上进行算数运算。如果你输入TZ=CST-8 date,那么得到的输出为:UTC时间加上8小时,而不是你可能想的,在当前中国时间基础减去8小时。它实际会把CST作为你自定义的时区名,而不是运算的时间基础,看上面的结果输出你就知道了,它在输出的时间后追加了定义的时区名。

如果你带了TZ的参数,但却未输入参数值,它依然输出UTC时间,并且输出结果不显示时区名,按上面的解释,因为你也没定义时区名嘛。如果未携带TZ参数,则本地系统时区时间。

第二种规则

TZ=[****] date

中括号内容为标准时区规范中支持的时区名!如常见的“Asia/Shanghai”等。如果你是Linux的发行版的话,可以键入tzselect查看,最后不要确认就是(tzselect是Linux系统中自带的时区查看工具)。当然部分shell支持tab补全,直接键入“TZ=”后tab即可,如下图

https://file.blog.humh.cn/2020/10/d2b5ca33bd970f64a6301fa75ae2eb22-2.png

这种规则下,它会输出你指定时区的时间,如下。

➜  ~ TZ=Asia/Shanghai date
2020年10月21日 星期三 18时40分27秒 CST
➜  ~ TZ=Asia/Tokyo date
2020年10月21日 星期三 19时40分31秒 JST

如果你输入的标准时区名,却按规则一的写法的话,它会按规则一来解析,认为你指定的标准时区名为自定义时区名。或者说,你仅输入时区名但输入的不是标准时区名,则它会直接输出UTC时间。如下:

➜  ~ TZ=Asia/Shanghai-8 date
2020年10月21日 星期三 18时40分50秒 Asia_Shanghai
➜  ~ TZ=Asia/Shanghai+8 date
2020年10月21日 星期三 02时41分07秒 Asia_Shanghai
➜  ~ TZ=Asia/ShanghaiTTT date
2020年10月21日 星期三 10时44分14秒 UTC

总结

如果你确定你想要的时间跟UTC相差多少小时的话,如我明确我想要的时间为东八区时间,则直接TZ=+8 date即可。

如果你确定标准时区名的话,则直接第二种规则即可,如上海时间,TZ=Asia/Shanghai date

如果你想要更改系统时间时区的话,直接配置TZ环境变量timedatectl或者其他方式即可。TZ与date命令结合的形式,其实就相当于使用一个临时环境变量TZ(timezone)仅作用于当前命令而已,并没有改变系统环境变量。

发表评论

textsms
account_circle
email

想你所想

Linux date命令获取指定时区的时间
众所周知,Linux系统中,可以使用date命令获取当前时间。 阅读本文前,你需要先清楚这些名次的概念:时区、UTC、GMT、常见的Asia/Shanghai、CST等。 如果我们想要获取某个时区…
扫描二维码继续阅读
2020-10-21