TZ - タイムゾーンを示す環境変数

【解説】

Unixはシステムの時刻を世界標準時(UTC)で管理しています。時間関数はUTC

を基準にして各地のローカルな時刻を求めます。そのときに必要な情報を持

っているのが環境変数TZです。

TZ はタイムゾーンを定義する環境変数です。TZにはまず3文字のタイムゾー

ン名を設定します。日本のタイムゾーン名はJST(Japan Standard Time) で

す。 つづいてUTC - JSTを時間単位で設定します。日本時間はUTCより9時間

進んでいますので-9になります。さらに、サマータイム制が採用されている

ときには、そのタイムゾーン名を3文字で設定します。 日本ではサマータイ

ム制は採用されていませんのでTZ=JST-9となります。アメリカ東部標準時で

はサマータイムが採用されているのでTZ=EST5EDTとなります。

サマータイムのタイムゾーン名が設定されているときにはグローバル変数

daylight が0ではなくなり、時間関数はサマータイムが採用されている事を

認識します。設定されていない場合にはdaylightは0になります。

グローバル変数tznameを使うことによって2 つのタイムゾーン名にアクセス

することができます。 tznameはchar *の配列で、tzname[0]は標準のタイム

ゾーン名、tzname[1]はサマータイム時のタイムゾーン名を指しています。

グローバル変数timezoneはUTC とローカルタイムの差を秒単位で表したもの

です。 時間関数はこれを使って UTC とローカルタイムの変換をおこないま

す。

以上の関係を表すと、次のようになります。

TZ=JST-9のとき

tzname[0] = "JST";

tzname[1] = "";

timezone = -9L*60L*60L;

daylight = 0;

TZ=EST5EDTのとき

tzname[0] = "EST";

tzname[1] = "EDT";

timezone = 5L*60L*60L;

daylight = 0以外の値;

これらのグローバル変数はtzset(3)によって環境変数TZからセットされます

が、各時間関数は自動的にtzset(3)を呼び出しますのでユーザが明示的に呼

び出す必要はありません。

環境変数TZが設定されていないときにはtzset(3)はTZ=GMT0 と仮定して各変

数をセットします。 これでローカルタイムとUTCが同一になりますから、こ

れまでの関数の動作とコンパチビリティがとれることになります。

strftime(3)で%Zを使わないかぎりはその違いは表面化しません。

<time.h>で宣言されている時間関数は次のようにUTC とローカルタイムの変

換をおこないます。ここに挙げられていない時間関数は変換はおこないませ

ん。

time()

ローカルタイム(DOS窓)-> UTC

clock()

ローカルタイム(DOS窓)-> UTC

ftime()

ローカルタイム(DOS窓)-> UTC

stime()

UTC ->ローカルタイム(DOS窓)

localtime()

UTC ->ローカルタイム

ctime()

UTC ->ローカルタイム

mktime()

ローカルタイム->UTC

時間関数のほかにも UTCとローカルタイムの変換をおこなうライブラリ関数

があります。それは、 ファイルのタイムスタンプを扱うもので、 stat(3),

fstat(3), gftime(3), utime(3)がそうです。DOS窓のファイルにつけられ

るタイムスタンプはローカルタイムですから、これらも一貫性を保つために

時間の変換を次のように実行します。

stat()

ローカルタイム(DOS窓)-> UTC

fstat()

ローカルタイム(DOS窓)-> UTC

gftime()

ローカルタイム(DOS窓)-> UTC

utime()

UTC ->ローカルタイム(DOS窓)

【可搬性】

UNIX, DOS窓

【参照】

time(3), ctime(3), timezone(3), strftime(3), tzset(3), ftime(3),

stat(3), fstat(3), gftime(3), utime(3)

【copyright (c) 安江正樹@東海大学理学部物理学科】