datetimematcher_ja - noonworks/Nursery GitHub Wiki

DateTimeMatcher

DateTimeMatcherは、日時の条件を表現・判定するクラスです。

1. 書式

1-1. 構成要素

日時は以下の19文字の書式で表現します。

yyyy.MM.dd-ND-HH:mm
  • yyyy : 西暦年。4桁で記述します。
  • MM : 月。2桁で記述します。
  • dd : 日。2桁で記述します。
  • N : 曜日番号。曜日が月のうちで何番目かを記述します。(例:第二金曜日ならば2、第三水曜日なら3
  • D : 曜日。日曜を0とし、土曜を6とする連番で記述します。
    0 1 2 3 4 5 6
  • HH : 時。2桁で記述します。
  • mm : 分。2桁で記述します。

各構成要素は、以下の文字を組み合わせて記述します。

  • 数値
  • ワイルドカード(後述)
  • 最終表現(後述)

1-2. ワイルドカード

日時の構成要素のうち、特に条件を指定しない部分は*を使ったワイルドカードで指定します。

1-2-1. ワイルドカード例:毎年、年が変わった直後(1/1の0時)

****.01.01-**-00:00
  • 年は何年でもいいので****年を指定します。
  • 曜日は第何何曜日でもいいので**を指定します。

1-2-2. ワイルドカード例:毎週火曜の21時

****.**.**-*2-21:00
  • 年、月、日はなんでもいいので*を指定します。
  • 第何火曜でもいいので*2を指定します。

1-2-3. ワイルドカード例:毎時30分

****.**.**-**-**:30
  • 分以外はなんでもいいので*を指定します。

1-2-4. ワイルドカード例:毎時10分台

****.**.**-**-**:1*
  • 分以外はなんでもいいので*を指定します。
  • 1*分は「10111213141516171819のいずれか」を表します。

1-3. 最終表現

  • 月末の日付は、月や年によって異なります。
  • その月の最終日曜が何番目の日曜なのか、といった、最終曜日も、月によって異なります。

こういった「最終」を表す特殊な表現が L(LastのL)です。

1-3-1. 月末の日付

LL
  • LLは「月末の日」を表します。
  • 日付(構成要素のdd)にのみ使用できます。

以下の例は、「2月末日の0時」を表します。(28日もしくは29日)

****.02.LL-**-00:00

1-3-2. 最後の曜日

L
  • Lは「最後の曜日」を表します。
  • 曜日番号(構成要素のN)にのみ使用できます。

以下の例は、「毎月、最終水曜日の0時」を表します。

****.**.**-L3-00:00

2. 判定

2-1. パターンとマッチ

  • パターンとは、前述の書式で表現した、日付の条件です。
  • ある日時がパターンで表現した条件を満たすことを、その日時は「パターンにマッチする」と言います。

例えば、パターン ****.**.**-*2-17:** (火曜日の17時台を表す)に対して:

  • 日時 2018/08/14 17:25マッチします
  • 日時 2019/06/04 17:25マッチします
  • 日時 2018/08/14 21:45マッチしません(17時台ではないため)。
  • 日時 2018/08/12 17:25マッチしません(火曜日ではないため)。

2-2. マッチの範囲

例えば、パターン ****.**.**-**-**:1* (毎時10分台) にマッチする日時は以下のようになります。

        ...                 ...
2018/08/14 17:09:00     マッチしない
        ...                 |
2018/08/14 17:09:59     マッチしない
2018/08/14 17:10:00     マッチする
        ...                 |
2018/08/14 17:19:59     マッチする
2018/08/14 17:20:00     マッチしない
        ...                 |
2018/08/14 18:09:59     マッチしない
2018/08/14 18:10:00     マッチする
        ...                 |
2018/08/14 18:19:59     マッチする
2018/08/14 18:20:00     マッチしない
        ...                 ...

約10分間マッチし、その後約50分間はマッチせず、また約10分間はマッチする……を繰り返しています。

しかし、スケジュールの起動条件では「マッチする10分の間、ずっとスケジュールの起動を繰り返す」のでは都合がよくありません。通常は、17:10にスケジュールが起動したら、次は18:10に起動するのが望まれる動作です。

そのためDateTimeMatcherは、「前回マッチした範囲」を記憶しておき、同じマッチ範囲では2回目以降はマッチしないように判定することができます。スケジュールの起動条件ではこの機能がオンになっています。