众所周知,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即可,如下图
这种规则下,它会输出你指定时区的时间,如下。
➜ ~ 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)仅作用于当前命令而已,并没有改变系统环境变量。
发表回复