世界時計

日本の時刻と GMT とロサンゼルスの時間を表示するものです。 ここでは世界時計に合わせてサマータイムを考慮しない簡単なものにしてあります。

awk は時間関係の関数が元々ありませんが、gawk 以降は最小限の関数が揃っていますので、簡単に時刻を取得することができます。

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

BEGIN {
    now            = strftime("%Y年%m月%d日 %H時%M分%S秒", systime());
    greenwich_time = strftime("%Y年%m月%d日 %H時%M分%S秒", systime() - 9 * 60 * 60);
    los_time       = strftime("%Y年%m月%d日 %H時%M分%S秒", systime() - (24 - 7) * 60 * 60);

    print "現在の時刻は、" now "です。";
    print "グリニッジ標準時刻は、" greenwich_time "です。";
    print "アメリカ・ロサンゼルスの時刻は、" los_time "です。";
}

実行してみます。

$ gawk -f awk_clock.awk
現在の時刻は、2009年04月17日 22時25分39秒です。
グリニッジ標準時刻は、2009年04月17日 13時25分39秒です。
アメリカ・ロサンゼルスの時刻は、2009年04月17日 05時25分39秒です。

strftime() 関数の第 2 引数は省略すると systime() 関数の戻り値と同じになりますが、ここではこの第 2 引数に時差 (Time Zone) を持たせることで各地の時刻を表示させています。

なお、小さなコマンド集としても知られている Busybox の awk も gawk 同様の拡張がなされているため動作します。

$ busybox awk -f awk_clock.awk
現在の時刻は、2009年04月17日 22時33分25秒です。
グリニッジ標準時刻は、2009年04月17日 13時33分25秒です。
アメリカ・ロサンゼルスの時刻は、2009年04月17日 05時33分25秒です。

個人的にはこういうのがオブジェクト指向に向いているのではないかと考えています。 つまり、同じ「時刻」という枠 (あえてクラスと呼びませんが) の中に各地の情報が含まれていて、それを表示するように指示してあげる (あえてメソッドとも呼びません) わけです。

awk でオブジェクト指向的 Hello World で紹介した awk++ で作ってみましょう。 言い忘れましたが awk++ は日本語がうまく通らない場合がありますので、英語的な表記にしています。 また、gawk の systime() が環境変数 TZ を見るため、日本からの時差という意味で使っています。

# world_clock.awkpp

class time {
    attribute now;
    method format(time_diff) {
        if (time_diff < 0) {
            time_diff = 24 - time_diff;
        }
        now = strftime("%Y-%m-%d %H:%M:%S", systime() - time_diff * 60 * 60);
    }

    method show() {
        return now;
    }
}

BEGIN {
    now = time.new();
    now.format(0);
    print "Japan: " now.show();
    now.format(9);
    print "GMT: " now.show();
    now.format(-7);
    print "Los: " now.show();
}

継承するべきものもないので作った後に無意味な気になってしまいましたが、実行してみます。

$ ./awkpp-run.sh world_clock.awkpp
Japan: 2009-04-17 23:00:46
GMT: 2009-04-17 14:00:46
Los: 2009-04-16 16:00:46

いかがでしょうか。

tag_gawk.pngtag_gawk.png