2010年6月23日水曜日

時刻取得関数を使う時の注意点まとめ - AWK

AWKの時刻取得関数と関連機能
過去の日付や時刻を扱う時は、基準時刻と経過時間について、確認する事をおすすめします。
閏秒に関する情報源については、systimeの説明文からどうぞ。


**** はじめに
o Gawk 系と mawk32 では、秒単位で時刻を取得する事が出来ます。
    + 取得出来るのは UNIX Time(= 特定日時からの経過時間)です。
    + 時刻文字列への変換は、「strftime = 時刻を文字列に変換する
    + 更に細かい単位を取得したい時は、時刻を取得するプログラムを(作って)呼び出します。
o 上記以外の処理系で時刻取得したい時は、「srand 関数」を使います。
    + 1回呼び出し、もしくは2回呼び出しを使います。
    + 取得出来るのは UNIX Time(= 特定日時からの経過時間)です。
    + 時刻文字列への変換は、自作する必要があります。
    + 非公式の使い方ですので、将来変わるかもしれません。


**** 過去に遡って時刻計算する時の確認ポイント
** 1. 閏秒が、経過秒数に含まれているかどうか
o POSIX準拠のUNIXシステムの場合、基本的には UTC(= 協定世界時)で1970年1月1日の0時からの経過秒数なのですが、閏秒は数えません。(= UTCとは違います。)
o Windowsシステムでも同様です。閏秒は数えません。
o 但し、UNIXで閏秒を有効にしている場合など、例外になるかもしれない時には、次の点について確認する必要があります。
   + 経過秒数の計算方法。閏秒が経過秒数に入っているかどうか
   + ログなど、閏秒が入るデータの有無と、対応方法
   + strftime関数とsystime関数で、閏秒への対応が同じかどうか

** 2. 閏年(2月29日)が、正しく経過秒数に含まれているかどうか
o システムによっては、過去や未来の閏年(2月29日)が正しく反映されていない事があるみたいです。
   + Web検索すると、毎回どこかで、閏年計算不具合が発覚しています。
o システム側に不具合があると、例えば計算によって時刻の値を求めている時に、2月29日分が抜けたり、3月1日分が入ったりします。
o 閏年の計算方法その1.普通の計算方法
   + 通常、西暦の年を 4 で割り切れる年は、閏年(= 2月は29日まで)
   + 但し、100で割り切れて、400で割り切れない年は平年(= 2月は28日まで)
o 閏年の計算方法その2。POSIX規格における計算方法
   + POSIX.1規格の場合は、西暦年を 4で割り切れる年は、常に閏年、となっているみたいです。
   + 基準日の1970年1月1日以降、2100年になるまでは、普通の計算方法と同じです。

** 3. 他の環境で動かす場合は、元の環境と同じように時間を扱っているかどうか
o 時刻の扱いが同じでない場合は、時刻に関するプログラムやデータを訂正する必要があります。


==
関連ページ:
    ▼AWKの時刻取得関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > ツール。systime関数とsrand関数の戻り値予想(Unix time)
    systime = 現在の時刻値(= 基準時刻からの経過秒数)を調べる(Gawk, mawk32専用)
    mktime = 特定日時の時刻値(= 基準時刻からの経過秒数)を調べる(Gawk専用)
    +
    配列を使う時の注意点まとめ
(2011年9月3日追加。はじめに欄)
(2010年6月24日追加。POSIX規格における、閏年の計算式)
(2010年6月23日訂正。タイトルの最後に、AWKの文字を追加)