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

Linux 在shell脚本中获取规范时区名称,linux,shell,time,timezone,Linux,Shell,Time,Timezone,有没有一种方法可以从Linux shell脚本中获取规范时区名称?例如,如果我配置的时区是PDT,那么我希望得到“America/Los_Angeles” 我知道,如果配置了符号链接/etc/localtime,我可以从中获得它,但由于它可能不是在所有服务器中都配置的,因此我不能依赖于该链接。 另一方面,我可以使用命令date+%Z获取短时区名称,但我仍然需要规范名称 即使没有设置符号链接/etc/localtime,是否有方法获取当前时区的规范名称或转换使用date+%Z命令获取的时区?这比听

有没有一种方法可以从Linux shell脚本中获取规范时区名称?例如,如果我配置的时区是PDT,那么我希望得到“America/Los_Angeles”

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


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

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

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

  • 首先检查/etc/时区,如果存在,请使用它
  • 接下来检查/etc/localtime是否是指向时区数据库的符号链接
  • 否则,请在/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名称的歧义将取决于您的应用程序


    -尼克

    我想说“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/