1234567890 秒までの残り時間を表示する

UNIX time が「1234567890」になるという記事がスラッシュドット・ジャパンに載って話題になっていますが、この中で以下のような Perl スクリプトが掲載されています。

perl -e 'print scalar localtime(1234567890),"\n";'

gawk では時間に関する関数も拡張されていますので、以下のような一行野郎で取得することができます。

$ gawk 'BEGIN{print strftime("%c",1234567890)}'
2009年02月14日 08時31分30秒

これを受けて1234567890秒までの残り時間を表示する。という記事がありました。 非常に分かりやすい Perl スクリプトで記述されていますので、ほぼそのまま awk に移植することができます。 なお、現時点の UNIX Time は systime() で取得することができます。

#! /usr/bin/gawk -f
# unixtime_1234567890_1.awk
# http://d.hatena.ne.jp/mzp/20090210/time

BEGIN {
    print "1234567890 秒まであと " format_time(1234567890 - systime());
}

# format_time():    UNIXTIME を HH 時間 MM 分 SS 秒の形式で返す
#   in:     UNIXTIME
#   out:    HH 時間 MM 分 SS 秒の形式
function format_time(num,       hour, rest, min, sec) {
    hour = num / (60 * 60);
    rest = num % (60 * 60);
    min  = rest / 60;
    sec  = rest % 60;

    return sprintf("%02d 時間 %02d 分 %02d 秒", hour, min, sec);
}

実行してみましょう。

$ gawk -f unixtime_1234567890_1.awk
1234567890 秒まであと 81 時間 02 分 17 秒

また、ターゲットとする日数が少ない場合には、format_time() の引数が 1970 年 1 月 1 日 0 時 0 分からの経過秒数としても問題ないため、以下のような記述も可能です。

#! /usr/bin/gawk -f
# unixtime_1234567890_2.awk

BEGIN {
    print "1234567890 秒まであと " format_time(1234567890 - systime());
}

# format_time():    UNIXTIME を HH 時間 MM 分 SS 秒の形式で返す
#   in:     UNIXTIME
#   out:    HH 時間 MM 分 SS 秒の形式
function format_time(num,   day, hour, min, sec) {
    num  = num - 24 * 60 * 60 - 9 * 60 * 60;

    day  = strftime("%d", num);
    hour = strftime("%H", num);
    min  = strftime("%M", num);
    sec  = strftime("%S", num);

    return day " 日 " hour " 時間 " min " 分 " sec " 秒";
}

ここで 24 時間を引くのは開始が既に 1 日目で計算されるためで、9 時間を引くのはタイムゾーン分を引かなければならないためです。 実行してみましょう。

$ gawk -f unixtime_1234567890_2.awk
1234567890 秒まであと 03 日 08 時間 44 分 31 秒

tag_gawk.pngtag_gawk.png