在shell脚本中获取规范时区名称

有没有从Linux shell脚本获取规范时区名称的方法? 例如,如果我configuration的时区是PDT,那么我想获得“America / Los_Angeles”。

我知道我可以从符号连接/ etc / localtime得到,如果它被configuration,但因为它可能没有configuration在所有的服务器我不能依靠那个。
另一方面,我可以使用命令date +%Z得到短时区名称,但是我仍然需要规范名称。

有没有办法获得当前时区的规范名称,或者转换使用date +%Z命令获取的时区,即使没有设置符号链接/ etc / localtime?

Solutions Collecting From Web of "在shell脚本中获取规范时区名称"

这比听起来更复杂。 大部分的Linux发行版都是这样做的,所以没有100%可靠的方法来获得Olson TZ的名字。

以下是我过去使用的启发式:

  1. 首先检查/ etc / timezone,如果存在使用它。
  2. 接下来检查/ etc / localtime是否是时区数据库的符号链接
  3. 否则在/ usr / share / zoneinfo中找到与文件/ etc / localtime具有相同内容的文件

未经测试的示例代码:

 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名称将取决于您的应用程序。

-缺口