這比聽起來更復雜。大多數Linux發行版都有不同的做法,所以沒有100%可靠的方法來獲得Olson TZ的名稱。
下面是我在過去已經使用了啓發式:
- 首先檢查/ etc /時區,如果它存在使用它。
- 下一個檢查,如果在/ etc/localtime就是符號鏈接的時區數據庫
- 否則找到具有相同內容 的文件在/ 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
我會說「PDT」更接近規範的名稱,而「美國/洛杉磯」只是一個描述性的標籤,以幫助映射到正確的時區的位置。 – chepner
我不認爲這是可能的;即使明確地擴展(例如到「太平洋夏令時」),單個縮寫也可具有多個相應的TZ數據庫條目。例如,PDT不僅是'America/Los_Angeles',還有'America/Dawson','America/Ensenada','America/Sitka','America/Tijuana','America/Vancouver','America/Whitehorse'和「美國/太平洋」。 (事實上,如果你沒有指定你想要'America/Los_Angeles',我會認爲你想'美國/太平洋'。) – ruakh