21

Linuxシェルスクリプトから正規のタイムゾーン名を取得する方法はありますか?たとえば、設定したタイムゾーンがPDTの場合、「America/Los_Angeles」を取得したいと思います。

シンボリックリンク/etc/ localtimeが構成されていれば取得できることはわかっていますが、すべてのサーバーで構成されていない可能性があるため、そのリンクに依存することはできません。
一方、コマンドdate +%Zで短いタイムゾーン名を取得できますが、それでも正規名が必要です。

シンボリックリンク/etc/ localtimeが設定されていない場合でも、現在のタイムゾーンの正規名を取得するか、date +%Zコマンドで取得したタイムゾーンを変換する方法はありますか?

4

1 に答える 1

32

これは思ったよりも複雑です。ほとんどのLinuxディストリビューションはそれを異なる方法で行うため、Olson TZ名を取得するための100%信頼できる方法はありません。

以下は、私が過去に使用したヒューリスティックです。

  1. 最初に/etc/ timezoneを確認し、存在する場合はそれを使用します。
  2. 次に、/ etc/localtimeがタイムゾーンデータベースへのシンボリックリンクであるかどうかを確認します
  3. それ以外の場合は、ファイル/ etc/localtimeと同じ内容のファイルを/usr/ share/zoneinfoで検索します

テストされていないサンプルコード:

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 に答える