こんにちは。阿部です。

みなさん、プレミアムフライデーしてますか?
私は、プレミアムフライデーかどうかにかかわらず、好きな日に休みを取りたい派ですが、それはさておき、プレミアムフライデーかどうか判定するバッチです。ご査収ください。

解説

Windowsには、日付計算を行うコマンドはありませんが、SET /Aコマンドで、数値計算を行うことができるので、これを利用して頑張って計算していきます。

うるう年かどうか判定する

まずは、うるう年判定です。年が((4の倍数である かつ 100の倍数でない) または 400の倍数である)場合、うるう年です。うるう年の場合、leapは1、平年の場合は0が入ります。

!演算子を利用すると、0が1に、0以外が1に変換されます。これを利用すると、「xがyの倍数である」を!(x%%y)と表すことができます。

月の日数を求める

「にしむくさむらい」です。知らない人は調べてみてね。計算式がわかりにくいですが、例えば3月の場合、!(m-3)の部分が1となり、その他の!(m-4)などがすべて0となることで、3月の日数を得ています。また、2月の日数は、うるう年と平年で異なるので、先ほど求めたleapを利用しています。

曜日を求める

年月日の数値から曜日を計算するには、ツェラーの公式を使用します。

ただし、1月を13月、2月を14月として計算することに注意が必要です。
数式は、複雑そうに見えるかもしれませんが、SET /Aの計算が、もともと小数点以下切り捨てなので、床関数は無視できます。
また、2017年以降を考えれば良いので、グレゴリオ暦とユリウス暦の分岐も不要です。そうすると、

結果は、月曜〜日曜が、D=1〜7の数値で得られます。

判定

ここまで準備できれば後は簡単です。プレミアムフライデーは月末の金曜日。つまり、月末から7日以内の金曜日のことです。

応用編

年、月からプレミアムフライデーの日を求めます。
最後の方を、ちょっと変えるだけです。月末日から(dayofweek+2) % 7を引けば、曜日が調整されて直近の金曜日になるので、それがプレミアムフライデーです。

TOP
TOP