TEDIA会員に登録したメールアドレスとパスワードを入力してください

メールアドレス:

     パスワード:


パスワードを忘れた方はパスワードの確認を行ってください。

TEDIA会員へのご登録がお済みで無い方はこちらで登録ができます


>> テクノロジーポータル TEDIA トップページへ戻る <<

mark Software Developer's Think IT mark 失敗しないソフト選び Find-IT mark テクノロジーポータル TEDIA

会員登録 登録情報管理

TEDIA SponsorsOpen Source Web Development Tutorials - Dev Shed

UNIXの時刻フォーマットの謎を解明する
(2008/11/17公開)

理論

 簡単に言えば、UNIXの時刻フォーマットは1970年1月1日の真夜中のUTC(協定世界時)から今までに経過した秒数を表している。ただし、うるう秒は考慮されていない。UTCおよびGMT(グリニッジ標準時)の詳細や定義については、その差が0.9秒以内であり、この記事の目的からも逸脱してしまうため、ここでは触れない。実用上はUTCをGMTと見なしても支障はない。

 UTCは、名前からも分かるようにUNIXと関係がある。UNIXの時刻は1970年1月1日が00:00:00 UTCであり、これは、ISO8601標準フォーマットでは1970-01-01T00:00:00Zと表される。基本的には、これが、この計測単位(UNIX時刻)が開始される基準点である。したがって、UNIX時刻の零時は、まさしく、この基準点を指す。

 UNIX時刻は、うるう秒を考慮していないため、時刻をリニアに表現するものではない。したがって、UTCとは一致していない。うるう秒を考慮に入れる方法も存在するが、今ここで考えることはしない。重要なことは、任意の日時をUNIXフォーマットに変換できることである。

 単純なスカラー実数だけで処理できるため、ここが肝要である。プログラマーの立場からは、これをビット(数字)のシーケンスと呼ぶことにしよう。UNIXの時刻フォーマットの主な利点の1つは、日時を使用する作業が非常に簡単になることだと言ったが、その理由は単純である。

 日時変数の値を3ヵ月先にずらす必要がある場合を次の例で考えてみよう。元のタイムスタンプが「2008-07-04T00:00:00」のような値から始まっている場合は複雑だ(UTC/GMTロケールの、終わりの+00:00を省略してある)。7月は31日あり、8月も同じで、9月は30日しかないことを考慮したり、どの部分が年、月、日を表しているのかを調べる必要もある。ロケールが異なれば習慣的な表記方法も異なる。

 元の日時を表すシーケンス「1215129600」を求め、元の日時変数に、3ヵ月ではなく90日を加算する方が簡単と言うものだ。UTCの1日は86400秒になる。したがって、90日先に進めるには、元の数字のシーケンスに90×86400を加算すればよく、結果は次のようになる。「1222905600」-ほら!何の造作もない。

 もう、お分かりのように、UNIXの時刻フォーマットは魔術でも何でもなく、単純な算術で表すことができる。小学校に通っている子供でも、ちゃんと説明してやれば、よろこんで計算することだろう。

 今度は、うるう年の計算が必要な場合をステップバイステップ式に見てみることにしよう。それでは、Mon, 31 Mar 2008 21:15:30の値から見てみよう。まず、1970年(UNIX零時)からのオフセットを計算する必要がある。2008-1970=38が得られる。うるう年は4年ごとに発生する。38/4=9.5(小数点以下は無視できるため、これは9と見なすことができる)。

 さらに、この38年を日数に変換しなければならない。そうすれば、38×365=13870が得られる。これにうるう年の9日を加算すると13879日になる。さらに、1月1日からのオフセットを計算して、31+29(今年は2月が29日ある)+31=91日が得られる。この91日を加算すると13879+91=13970日になる。

 前に説明したように、1日は86,400秒である。この値を乗算すると13970×86400=1207008000の値が得られる。後は時刻を加算するだけだ。09 PMは21時のことだから、オフセットは零時から21時間になる。1時間は3600秒だから、21×3600=75600。これに15分30秒を加算すると、1分は60秒だから、15×60+30=930秒になる。75600+930=76530。

 最後に、前述の秒数の数字のシーケンスを加算する必要がある。最終的な結果は1207008000+76530=1207084530になる。はい、今日の授業はここまで。算数の授業はこれで終わり。次はプログラミング。


前のページ     1    2    3    4    次のページ

Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.