2. タイムゾーンとは

タイムゾーンとは、地球を地理学的に、 イギリスのグリニッジを起点として 15o ごとに分割したものです。 世界の別の場所では今何時なのか、 ということをわかりやすくするために作られました。

近年ではタイムゾーンは、地理学的というよりは、 ずっと政治的なものになっています。 人々は「近くの人たち」と時刻を共有したい場合があるからです。 また省エネルギーの面から、今日では サマータイム (Daylight Savings Time) が利用されており、これもタイムゾーンを変化させます。

タイムゾーンは通常各国の政府や天文機関によって定義され、 3 文字または 4 文字で表記されます。 例は Section 2.2 を見てください。

世界の別の地域で今何時なのかを知りたい場合には、 timezoneconverter.com の web サイトを使うとわかります。

2.1. サマータイム (Daylight Savings Time, DST)

エネルギー節約のため、各国の政府はサマータイムを設けることがあります。 私たちの時計は 1 時間進められ、これによって昼間が長くなったように感じられます。 実際に起きているのは、単にタイムゾーンの変更にすぎません。 基準となる時刻 (UTC) は不変で、 常に同じです。

Linux でサマータイムを自動的に有効・無効にする方法については、 後ほど見ていくことにします。

2.2. タイムゾーンの例

例をお見せする以上にわかりやすい説明はないでしょう。

US のタイムゾーンについて、このような表をどなたか送っていただけませんか。

2.3. Linux におけるタイムゾーンの仕組み

Linux システムは GLIBC の動的なタイムゾーンを用いており、 これは /etc/localtime で決まります。 このファイルは、あるゾーン情報ファイルへのリンク (またはそのコピー) です。 ゾーン情報ファイルは通常 /usr/share/zoneinfo ディレクトリ以下に置かれています。

地理学的な観点からいうと、世界には 360o/15o=24 のタイムゾーンだけあれば良いはずです。 しかし物事をわかりやすくするため、 また政治的な変更 (サマータイムなど) にあわせやすくするため、 /usr/share/zoneinfo には数百もの zoneinfo ファイルが置かれています。 それぞれは世界中のあらゆる都市・国などに対応していますが、 完全なものではありません (それは無理でしょう)。

国によっては (ブラジルもそうですが)、 サマータイムの開始する日付が決まっていないこともあります。 ブラジルではサマータイムは年ごとに決定され、夏の 2〜3 か月前に始まります。 この状況をうまく扱うには、zoneinfo ファイルを自分で変更しなければなりません。 zoneinfo ファイルは、以下のようなテキストファイルを zic コマンドでコンパイルすることによって生成されます。

Example 1. ブラジルのゾーン情報のテキストファイル


# Brazil Time Zones
#
# Brazilian Time Zones are:
# BREST: East of Brasilia. Fernando de Noronha.
# BRST:  Brasilia, S竢 Paulo, Rio, Northeast, South etc
# BRWST: West of Brasilia. Mato Grosso, Manaus
# BRAST: Acre.
#
# In daylight saving time, letter 'S' changes to 'D'.
#
# To install, make:
#
# # zic Brazil.txt
#
# Zone files will be installed in /usr/share/zoneinfo (depends on your
# distribution). Then, make a symbolic link from your zone to /etc/localtime:
#
# # ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime
#
#
# If you have updates and new standards to this file please send to
#
# Avi Alkalay <avi @ unix.sh>
#
# Last update: 18 Nov 2000
# This file is available at http://avi.alkalay.net/linux/zoneinfo/
#

# Rule  NAME    FROM  TO    TYPE  IN    ON   AT    SAVE   LETTER/S
Rule    Brazil  1931  1932  -     Oct   3    0:00  1:00   D
Rule    Brazil  1932  1933  -     Mar   31   0:00  0      S
Rule    Brazil  1949  only  -     Dec   1    0:00  1:00   D
Rule    Brazil  1950  only  -     Apr   30   0:00  0      S
Rule    Brazil  1950  1952  -     Dec   1    0:00  1:00   D
Rule    Brazil  1951  only  -     Apr   16   0:00  0      S
Rule    Brazil  1952  only  -     Mar   31   0:00  0      S
Rule    Brazil  1953  only  -     Feb   28   0:00  0      S
Rule    Brazil  1963  only  -     Oct   23   0:00  1:00   D
Rule    Brazil  1964  only  -     Mar   1    0:00  0      S
Rule    Brazil  1965  only  -     Jan   31   0:00  1:00   D
Rule    Brazil  1965  only  -     Mar   31   0:00  0      S
Rule    Brazil  1965  only  -     Dec   1    0:00  1:00   D
Rule    Brazil  1966  1968  -     Mar   1    0:00  0      S
Rule    Brazil  1966  1967  -     Nov   1    0:00  1:00   D
Rule    Brazil  1984  only  -     Nov   2    0:00  1:00   D
Rule    Brazil  1985  only  -     Mar   15   0:00  0      S
Rule    Brazil  1985  only  -     Nov   2    0:00  1:00   D
Rule    Brazil  1986  only  -     Mar   15   0:00  0      S
Rule    Brazil  1986  only  -     Oct   25   0:00  1:00   D
Rule    Brazil  1987  only  -     Feb   14   0:00  0      S
Rule    Brazil  1987  only  -     Oct   25   0:00  1:00   D
Rule    Brazil  1988  only  -     Feb   7    0:00  0      S
Rule    Brazil  1988  only  -     Oct   16   0:00  1:00   D
Rule    Brazil  1989  only  -     Jan   29   0:00  0      S
Rule    Brazil  1989  only  -     Oct   15   0:00  1:00   D
Rule    Brazil  1990  only  -     Feb   11   0:00  0      S
Rule    Brazil  1990  only  -     Oct   21   0:00  1:00   D
Rule    Brazil  1991  only  -     Feb   17   0:00  0      S
Rule    Brazil  1991  only  -     Oct   20   0:00  1:00   D
Rule    Brazil  1992  only  -     Feb   9    0:00  0      S
Rule    Brazil  1992  only  -     Oct   25   0:00  1:00   D
Rule    Brazil  1993  only  -     Jan   31   0:00  0      S
Rule    Brazil  1993  only  -     Oct   17   0:00  1:00   D
Rule    Brazil  1994  only  -     Feb   20   0:00  0      S
Rule    Brazil  1994  only  -     Oct   16   0:00  1:00   D
Rule    Brazil  1995  only  -     Feb   19   0:00  0      S
Rule    Brazil  1995  only  -     Oct   15   0:00  1:00   D
Rule    Brazil  1996  only  -     Feb   11   0:00  0      S
Rule    Brazil  1996  only  -     Oct   06   0:00  1:00   D
Rule    Brazil  1997  only  -     Feb   16   0:00  0      S
Rule    Brazil  1997  only  -     Oct   06   0:00  1:00   D
Rule    Brazil  1998  only  -     Mar   01   0:00  0      S
Rule    Brazil  1998  only  -     Oct   11   0:00  1:00   D
Rule    Brazil  1999  only  -     Feb   21   0:00  0      S
Rule    Brazil  1999  only  -     Oct   03   0:00  1:00   D
Rule    Brazil  2000  only  -     Feb   27   0:00  0      S
Rule    Brazil  2000  only  -     Oct   8    0:00  1:00   D
Rule    Brazil  2001  only  -     Feb   18   0:00  0      S


# Zone  NAME                          GMTOFF  RULES/SAVE    FORMAT  [UNTIL]
Zone    Brazil/DeNoronha              -2:00   Brazil        BRE%sT
Zone    posix/Brazil/DeNoronha        -2:00   Brazil        BRE%sT
Zone    right/Brazil/DeNoronha        -2:00   Brazil        BRE%sT
Zone    Brazil/East                   -2:00   Brazil        BRE%sT
Zone    posix/Brazil/East             -2:00   Brazil        BRE%sT
Zone    right/Brazil/East             -2:00   Brazil        BRE%sT

Zone    America/Sao_Paulo             -3:00   Brazil        BR%sT
Zone    America/Rio_de_Janeiro        -3:00   Brazil        BR%sT
Zone    America/Brasilia              -3:00   Brazil        BR%sT
Zone    posix/America/Sao_Paulo       -3:00   Brazil        BR%sT
Zone    posix/America/Rio_de_Janeiro  -3:00   Brazil        BR%sT
Zone    posix/America/Salvador        -3:00   Brazil        BR%sT
Zone    posix/America/Brasilia        -3:00   Brazil        BR%sT
Zone    posix/Brazil/Central          -3:00   Brazil        BR%sT
Zone    posix/Brazil/Brasilia         -3:00   Brazil        BR%sT
Zone    posix/Brazil/Sao_Paulo        -3:00   Brazil        BR%sT
Zone    posix/Brazil/Salvador         -3:00   Brazil        BR%sT
Zone    posix/Brazil/Rio_de_Janeiro   -3:00   Brazil        BR%sT
Zone    right/America/Sao_Paulo       -3:00   Brazil        BR%sT
Zone    right/America/Rio_de_Janeiro  -3:00   Brazil        BR%sT
Zone    right/America/Salvador        -3:00   Brazil        BR%sT
Zone    right/America/Brasilia        -3:00   Brazil        BR%sT
Zone    right/Brazil/Central          -3:00   Brazil        BR%sT
Zone    right/Brazil/Brasilia         -3:00   Brazil        BR%sT
Zone    right/Brazil/Sao_Paulo        -3:00   Brazil        BR%sT
Zone    right/Brazil/Salvador         -3:00   Brazil        BR%sT
Zone    right/Brazil/Rio_de_Janeiro   -3:00   Brazil        BR%sT
Zone    Brazil/Central                -3:00   Brazil        BR%sT
Zone    Brazil/Brasilia               -3:00   Brazil        BR%sT
Zone    Brazil/Sao_Paulo              -3:00   Brazil        BR%sT
Zone    Brazil/Rio_de_Janeiro         -3:00   Brazil        BR%sT
Zone    Brazil/Salvador               -3:00   Brazil        BR%sT

Zone    Brazil/West                   -4:00   Brazil        BRW%sT
Zone    Brazil/Manaus                 -4:00   Brazil        BRW%sT
Zone    Brazil/Rondonia               -4:00   Brazil        BRW%sT
Zone    Brazil/Roraima                -4:00   Brazil        BRW%sT
Zone    Brazil/Mato_Grosso            -4:00   Brazil        BRW%sT
Zone    posix/Brazil/Manaus           -4:00   Brazil        BRW%sT
Zone    posix/Brazil/Mato_Grosso      -4:00   Brazil        BRW%sT
Zone    right/Brazil/Manaus           -4:00   Brazil        BRW%sT
Zone    right/Brazil/Mato_Grosso      -4:00   Brazil        BRW%sT
Zone    posix/America/Manaus          -4:00   Brazil        BRW%sT
Zone    right/America/Manaus          -4:00   Brazil        BRW%sT

Zone    Brazil/Acre                   -5:00   Brazil        BRA%sT
				

Rule ブロックは タイムゾーンを変更する日付と時刻を定義しています。 一方 Zone ブロックでは、 そのゾーンを管理する Rule を参照しています。

このファイルのコメントでは、 ゾーン情報コンパイラである zic を使ってこれらのタイムゾーンをインストールする方法が説明されています (既にインストール済みになっていると思いますが)。 インストールしたものを有効にするには、そのゾーン情報ファイルを /etc/localtime ファイルからリンク (あるいはコピー) するだけで OK です。 ディストリビューションによっては、より高度な (そしておそらくより望ましい) タイムゾーンの設定方法が存在します。これらは Section 3.1 で説明します。

/etc/localtime が正しい zoneinfo ファイルを指すようにしたら、 既にあなたのコンピュータはそのゾーンの規則に従っており、 サマータイムの変更も自動的に行われます。 時刻を手動で変更する必要はありません。

次に示す一連のコマンドは、 Linux のタイムゾーンに関するメカニズムの動作を示すものです。 これらはすべて 1 分以内に実行されたものです。

bash$ ls -al /etc/localtime
lrwxrwxrwx  1 root root 35 May 22  2001 /etc/localtime -> /usr/share/zoneinfo/Brazil/Brasilia
bash$ date
Fri Mar 29 20:13:38 BRST 2002
bash# ln -sf /usr/share/zoneinfo/GMT /etc/localtime
bash$ date
Fri Mar 29 23:13:47 GMT 2002
bash# ln -sf /usr/share/zoneinfo/Brazil/Brasilia /etc/localtime
bash$ date
Fri Mar 29 20:14:03 BRST 2002

20:13 に、私は自分のデフォルトであるブラジルのタイムゾーン (BRST) にいました。 ここで私は自分のシステムを GMT に変更し、すると私のシステム時刻は 23:13 になりました! あなたも、自分のいるタイムゾーンがサマータイムに変わったときに、 同様の現象を見ることになります [訳注: 日本国内では無理ですが :-)]。 ただしその規則はすべてタイムゾーンの内部にあるものです (/etc/localtime のリンクが この例のように変わるわけではありません)。

このマシンで動作しているアプリケーション (アクセスログを生成する web サーバなど) は、 この変更を認識します。 したがって Section 1 で述べたとおり、 完全な意味での時刻とは現在の時刻 プラス現在のタイムゾーンである、 という事実を理解することは、開発者にとって非常に重要です。

最後に私は、自分の正しいタイムゾーンに戻しました。