2012-09-20 76 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

好吧,這不是我正在尋找的東西,但它會起作用。謝謝 :) –