2012-09-20 42 views
10

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

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

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

+1

我会说“PDT”更接近规范的名称,而“美国/洛杉矶”只是一个描述性的标签,以帮助映射到正确的时区的位置。 – chepner

+1

我不认为这是可能的;即使明确地扩展(例如到“太平洋夏令时”),单个缩写也可具有多个相应的TZ数据库条目。例如,PDT不仅是'America/Los_Angeles',还有'America/Dawson','America/Ensenada','America/Sitka','America/Tijuana','America/Vancouver','America/Whitehorse'和“美国/太平洋”。 (事实上​​,如果你没有指定你想要'America/Los_Angeles',我会认为你想'美国/太平洋'。) – ruakh

回答

19

这比听起来更复杂。大多数Linux发行版都有不同的做法,所以没有100%可靠的方法来获得Olson TZ的名称。

下面是我在过去已经使用了启发式:

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

未测试示例代码:

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

-nick

+0

好吧,这不是我正在寻找的东西,但它会起作用。谢谢 :) –