n 日後の日付を返す

n日後の日付を調べるプログラム - みずぴー日記 にインスパイヤされて awk でも n 日後の日付を調べてみます。

nawk, mawk には日付を直接的に扱うことができず、date コマンドの戻り値や srand() の戻り値から計算する必要がありました。 ところが date コマンドの戻り値は date コマンドの実装に依存し、srand() の戻り値は awk のビルド環境に依存するという問題やタイムゾーンを見ないという問題があります。

そこで、gawk 以降に搭載されている systime() 関数と strftime() 関数を用いて、簡単に求めてみることにします。 nawk 等で日付を扱う場合には、AWK Users JP :: nawk で時刻取得 あたりの情報が役に立つでしょう。

#! /usrl/local/bin/gawk -f
# days_after_today.awk
# n 日後の日付を調べる
# usage: gawk -f days_after_today.awk num

BEGIN {
    days = ARGV[1];

    print days_after_today(days);
}

# days_after_today():   n 日後の日付を YYYY-MM-DD の形式で返す
#   in:     n 日後
#   out:    n 日後の日付を YYYY-MM-DD の形式で返す
function days_after_today(n,    sec_after_today) {
    sec_after_today = n * 86400;

    return strftime("%Y-%m-%d", systime() + sec_after_today);
}

実際に実行してみましょう。

$ date
Mon Aug  2 11:47:52 JST 2010

$ gawk -f days_after_today.awk
2010-08-02

$ gawk -f days_after_today.awk 1
2010-08-03

$ gawk -f days_after_today.awk 100
2010-11-10

$ gawk -f days_after_today.awk 1000
2013-04-28

正しく機能しているようです。

gawk の機能を用いることで、簡単かつ正確に求めることが可能です。

日本では新しい gawk の拡張機能について説明している書籍が少ないのですが、積極的に使っていくことで脳力を使わずにプログラムしたいものです。

tag_gawk.png tag_gawk.png