Linux 在shell脚本中获取规范时区名称
有没有一种方法可以从Linux shell脚本中获取规范时区名称?例如,如果我配置的时区是PDT,那么我希望得到“America/Los_Angeles” 我知道,如果配置了符号链接/etc/localtime,我可以从中获得它,但由于它可能不是在所有服务器中都配置的,因此我不能依赖于该链接。Linux 在shell脚本中获取规范时区名称,linux,shell,time,timezone,Linux,Shell,Time,Timezone,有没有一种方法可以从Linux shell脚本中获取规范时区名称?例如,如果我配置的时区是PDT,那么我希望得到“America/Los_Angeles” 我知道,如果配置了符号链接/etc/localtime,我可以从中获得它,但由于它可能不是在所有服务器中都配置的,因此我不能依赖于该链接。 另一方面,我可以使用命令date+%Z获取短时区名称,但我仍然需要规范名称 即使没有设置符号链接/etc/localtime,是否有方法获取当前时区的规范名称或转换使用date+%Z命令获取的时区?这比听
另一方面,我可以使用命令date+%Z获取短时区名称,但我仍然需要规范名称
即使没有设置符号链接/etc/localtime,是否有方法获取当前时区的规范名称或转换使用date+%Z命令获取的时区?这比听起来更复杂。大多数linux发行版都有不同的做法,因此没有100%可靠的方法来获得Olson TZ名称 以下是我过去使用过的启发式方法:
if [ -f /etc/timezone ]; then
OLSONTZ=`cat /etc/timezone`
elif [ -h /etc/localtime ]; then
OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"`
else
checksum=`md5sum /etc/localtime | cut -d' ' -f1`
OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1`
fi
echo $OLSONTZ
请注意,这个快速示例不处理多个TZ名称与给定文件匹配的情况(在/usr/share/zoneinfo中查找时)。消除适当的TZ名称的歧义将取决于您的应用程序
-尼克我想说“PDT”更接近于一个规范的名字,而“America/Los_Angeles”只是一个描述性的标签,有助于将一个位置映射到正确的时区。我认为这是不可能的;一个缩写,即使被明确地扩展(例如,扩展到“太平洋夏令时”),也可以有多个对应的TZ数据库条目。例如,PDT不仅是
America/Los_Angeles
,而且是America/Dawson
,America/Ensenada
,America/Sitka
,America/Tijuana
,America/Vancouver
,America/Whitehorse
,以及US/Pacific
。(事实上,如果你没有指定你想要America/Los_Angeles
,我会假设你想要US/Pacific
)嗯,这不完全是我想要的,但它会起作用。谢谢:)我使用了这个而不是md5,并且在posixrules文件中阻止了匹配:find/usr/share/zoneinfo-type f-名称为'posixrules'-execcmp-s{}/etc/localtime\-打印| sed-e's@.*/zoneinfo/@'| head-n1
我发现Etc
目录只包含数字时区,所以我将它们从@user9645的查找中排除了出来:-regex“*/Etc/*”
对于OSX,您应该使用/var/db/timezone/zoneinfo/
而不是/usr/share/zoneinfo/