21

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

我知道如果配置了符号链接 /etc/localtime ,我可以得到它,但由于它可能未在所有服务器中配置,我不能依赖那个。
另一方面,我可以使用命令 date +%Z 获得短时区名称,但我仍然需要规范名称。

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

4

1 回答 1

32

这比听起来要复杂得多。大多数 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 名称的歧义将取决于您的应用程序。

-缺口

于 2012-09-21T01:57:56.123 回答