Linux では、現在設定されているタイムゾーンを Olson の場所として見つける必要があります。(C または C++) コードをできるだけ多くの Linux システムに移植できるようにしたいと考えています。
たとえば、私はロンドンに住んでいるので、現在のオルソンの場所は「ヨーロッパ/ロンドン」です。ない「BST」、「EST」などのタイムゾーン ID に興味があります。
Debian と Ubuntu にはこの情報を含むファイルがあります/etc/timezone
が、そのファイルが常に存在するとは限らないと思います。Gnome にoobs_time_config_get_timezone()
も正しい文字列を返す関数がありますが、Gnome のないシステムでもコードを動作させたいのです。
では、Linux 上で現在設定されているタイムゾーンを Olson の場所として取得する最も一般的な方法は何でしょうか?
ベストアンサー1
その信頼できる答えを得るのは難しいのようなものに頼るのが/etc/timezone
最善策かもしれません。
(他の回答で示唆されているように、変数tzname
とtm_zone
のメンバーには通常、質問で要求されている Olson 時間文字列ではなく、/struct tm
などの略語が含まれます)。GMT
BST
- Debian ベースのシステム (Ubuntu を含む) では、
/etc/timezone
正しい答えを含むファイルです。 - 一部の Redhat ベースのシステム (少なくとも CentOS、RHEL、Fedora の一部のバージョンを含む) では、
/etc/localtime
(たとえば) へのシンボリックリンクである に対してreadlink() を使用して必要な情報を取得できます/usr/share/zoneinfo/Europe/London
。 - OpenBSD は RedHat と同じスキームを使用しているようです。
ただし、上記の方法にはいくつか問題があります。ディレクトリにはや/usr/share/zoneinfo
などのファイルも含まれているため、ユーザーがそこを指すようにシンボリックリンクを構成する可能性があります。GMT
GB
また、ユーザーがシンボリックリンクを作成する代わりに、正しいタイムゾーン ファイルをそこにコピーすることを妨げるものは何もありません。
これを回避する 1 つの方法 (Debian、RedHat、OpenBSD では機能するようです) は、/etc/localtime ファイルの内容を /usr/share/zoneinfo の下のファイルと比較し、一致するものを確認することです。
eta:~% md5sum /etc/localtime
410c65079e6d14f4eedf50c19bd073f8 /etc/localtime
eta:~% find /usr/share/zoneinfo -type f | xargs md5sum | grep 410c65079e6d14f4eedf50c19bd073f8
410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/London
410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Belfast
410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Guernsey
410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Jersey
410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Isle_of_Man
...
...
もちろん不利益これは、現在のタイムゾーンと同一のタイムゾーンをすべて表示します。(これは完全な意味で同一であることを意味します。つまり、「現在同じ時刻」だけでなく、「システムが認識している限り、常に同じ日に時計が変更される」という意味です。)
最善策は、上記の方法を組み合わせることです。/etc/timezone
存在する場合はそれを使用します。そう/etc/localtime
でない場合は、シンボリックリンクとして解析を試みます。それが失敗した場合は、一致するタイムゾーン定義ファイルを検索します。それが失敗した場合は、あきらめて家に帰ります ;-)
(そして、上記のいずれかが AIX に当てはまるかどうかはわかりません...)