Linux の timezone についてちょっと調べた。
Ubuntu では、現在の timezone は /etc/localtime にある。このファイル自体はシンボリックリンクで、実体は /usr/share/zoneinfo
以下にある。ここに timezone には関係する色々な情報が入っているらしいが、バイナリファイルなので直接は読めない。中を調べる方法は二つある。
zdump でファイルを読む
zdump は現在の時刻を指定された timezone で表示するツールだが、-v オプションを付けると timezone data の解釈を表示してくれる。
$ zdump -v /usr/share/zoneinfo/Japan | tail
/usr/share/zoneinfo/Japan Sat May 6 16:59:59 1950 UT = Sun May 7 01:59:59 1950 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan Sat May 6 17:00:00 1950 UT = Sun May 7 03:00:00 1950 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan Fri Sep 8 15:59:59 1950 UT = Sat Sep 9 01:59:59 1950 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan Fri Sep 8 16:00:00 1950 UT = Sat Sep 9 01:00:00 1950 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan Sat May 5 16:59:59 1951 UT = Sun May 6 01:59:59 1951 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan Sat May 5 17:00:00 1951 UT = Sun May 6 03:00:00 1951 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan Fri Sep 7 15:59:59 1951 UT = Sat Sep 8 01:59:59 1951 JDT isdst=1 gmtoff=36000
/usr/share/zoneinfo/Japan Fri Sep 7 16:00:00 1951 UT = Sat Sep 8 01:00:00 1951 JST isdst=0 gmtoff=32400
/usr/share/zoneinfo/Japan 9223372036854689407 = NULL
/usr/share/zoneinfo/Japan 9223372036854775807 = NULL
それぞれの意味はマニュアルを読んでも良くわからなかったが、複数のゾーンが定義されている雰囲気は分かる。
ソースコードを読む
apt-get source tzdata
でソースコードを取得できるが、大本は Time Zone Database らしい。日本のタイムゾーンのソースは https://github.com/eggert/tz/blob/master/asia#L1512 にある。これが歴史的資料感を醸し出していて非常に面白い。
timezone の変更方法
ここでも systemd の支配が及んでいて、timezone の変更も systemd で行う。コマンド名は timedatectl。
timezone を自動検出する方法としては tzupate というのを見つけた。ip-api.com などの API を利用している。
現在位置を求める方法として GeoClue も使えそうだが TimeZone を返す API は見つからなかった。
参考
- tzfile マニュアル timezone data のフォーマット
- zdump マニュアル
- How can I examine the contents of /etc/localtime?
- how to read time zone information
- Time Zone Database
- ubuntu パッケージ tzdagta
この調査の動機は現在使ってる AGL に timezone を設定したかったからだが、意外と面倒だったのでやめた。