【解説】
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) 安江正樹@東海大学理学部物理学科】