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*
分は「10
、11
、12
、13
、14
、15
、16
、17
、18
、19
のいずれか」を表します。
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回目以降はマッチしないように判定することができます。スケジュールの起動条件ではこの機能がオンになっています。