時間帯重複チェック

時間帯重複チェックのお題を解いてみた - forest boo にインスパイヤされて時間帯重複チェックを行います。 元々のお題は お題:時間帯重複チェック - No Programming, No Life によるものです。

ここでは話を簡単にするために 2 つの時間帯のみで重複のチェックを行います。

時間帯重複チェックのお題を解いてみた - forest boo に「開始時刻でソートすることで、n 番目の終了時刻 > n + 1 番目の開始時刻を満たすときが「重複有り」でシンプルにチェックできます」とありますが、ここではソートを行わずに、以下のような条件でチェックを行っています。

1 番目の開始時間 < 2 番目の終了時間
または
2 番目の開始時間 < 1 番目の終了時間

この条件で関数 time_duplication_check() を作成します。

#! /usr/local/bin/gawk -f
# time_duplication_check.awk
# 時間帯重複チェックを行う
# usage: gawk -f time_duplication_check.awk

BEGIN {
    print time_duplication_check(1, 0, 5, 30, 9, 0, 23, 0);
    print time_duplication_check(1, 0, 2, 0, 2, 0, 3, 0);
    print time_duplication_check(1, 0, 2, 1, 1, 59, 3, 0);
}

# time_duplication_check():     時間帯重複チェックを行う
#   input:  時間 (開始時 1, 開始分 1, 終了時 1, 終了分 1,
#                 開始時 2, 開始分 2, 終了時 2, 終了分 2)
#   output; 重複あり = 1
#           重複なし = 0
function time_duplication_check(t1, t2, t3, t4, t5, t6, t7, t8) {
    start_time1     = mktime("2011 03 28 " t1 " " t2 " 0");
    end_time1       = mktime("2011 03 28 " t3 " " t4 " 0");
    start_time2     = mktime("2011 03 28 " t5 " " t6 " 0");
    end_time2       = mktime("2011 03 28 " t7 " " t8 " 0");

    if (start_time1 < end_time2 && start_time2 < end_time1) {

        return 1;

    } else {
        return 0;
    }
}

最初の 2 つは重複がなく、最後のものだけに重複がありますので、実行結果も以下のようになります。

$ gawk -f time_duplication_check.awk
0
0
1

さて、時間帯重複チェックのお題を解いてみた - forest boo に出てくる 24:00 という時刻が入力された場合に gawk の mktime() 関数はどのように振舞うのでしょうか? 実は gawk の mktime() 関数は 24:00 を超えても正常な値を返します。

$ gawk 'BEGIN {print mktime("2011 03 28 23 59 00")}'
1301324340

$ gawk 'BEGIN {print mktime("2011 03 28 24 00 00")}'
1301324400

$ gawk 'BEGIN {print mktime("2011 03 28 25 00 00")}'
1301328000

もちろん、こうしたものは言語依存があるため、仕様の段階で決めておいた方が良さそうですね。

tag_gawk.png tag_gawk.png