今日は第何火曜日?

今日は第何火曜日? - みずぴー日記を見て、解答を見ずに考えて、しばらく悩んでしまったのですが、非常に簡単な関数で今日は第何何曜日かを返す関数を作ることができます。

#! /usr/local/bin/gawk -f
# date-week-day-number-of-month.awk
# 指定した日が第 n {日,月,火,水,木,金,土} 曜日かを調べる関数
# usage: gawk -f date-week-day-number-of-month.awk [day month year]

BEGIN {
    # あくまで BEGIN の中は検証用のものです
    year  = 2009;
    month = 6;
    for (i = 1; i <= 30; i++) {
        print year "/" month "/" i " ... " \
              date_week_day_number_of_month(i) " 回目の " \
              strftime("%A", mktime(year " " month " " i " 12 0 0")) "。";
    }
}

# date_week_day_number_of_month():
#   指定した日が第 n {日,月,火,水,木,金,土} 曜日かを調べる関数
#   in:     日 (day)
#   out:    指定した日が第 n {日,月,火,水,木,金,土} 曜日か (n)
function date_week_day_number_of_month(day) {
    return int((day - 1) / 7) + 1;
}

検証用の部分には gawk 用の関数を用いていますが、実際の関数 date_week_day_number_of_month() はどの awk でも動作します。

実行してみましょう。

$ cal
      June 2009
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

$ gawk -f date-week-day-number-of-month.awk
2009/6/1 ... 1 回目の Monday。
2009/6/2 ... 1 回目の Tuesday。
2009/6/3 ... 1 回目の Wednesday。
2009/6/4 ... 1 回目の Thursday。
2009/6/5 ... 1 回目の Friday。
2009/6/6 ... 1 回目の Saturday。
2009/6/7 ... 1 回目の Sunday。
2009/6/8 ... 2 回目の Monday。
2009/6/9 ... 2 回目の Tuesday。
2009/6/10 ... 2 回目の Wednesday。
2009/6/11 ... 2 回目の Thursday。
2009/6/12 ... 2 回目の Friday。
2009/6/13 ... 2 回目の Saturday。
2009/6/14 ... 2 回目の Sunday。
2009/6/15 ... 3 回目の Monday。
2009/6/16 ... 3 回目の Tuesday。
2009/6/17 ... 3 回目の Wednesday。
2009/6/18 ... 3 回目の Thursday。
2009/6/19 ... 3 回目の Friday。
2009/6/20 ... 3 回目の Saturday。
2009/6/21 ... 3 回目の Sunday。
2009/6/22 ... 4 回目の Monday。
2009/6/23 ... 4 回目の Tuesday。
2009/6/24 ... 4 回目の Wednesday。
2009/6/25 ... 4 回目の Thursday。
2009/6/26 ... 4 回目の Friday。
2009/6/27 ... 4 回目の Saturday。
2009/6/28 ... 4 回目の Sunday。
2009/6/29 ... 5 回目の Monday。
2009/6/30 ... 5 回目の Tuesday。

現在使っている環境の環境変数 LANG が en_US.UTF8 なので、英語表記になっていますが、ja_JP.UTF8 など通常の日本語環境であれば、日本語で表示されます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png