当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2015年1月19日月曜日

ハッピーマンデーの計算をしてみる

みなさん、こんにちは。
2015年もすでに1月半ばを過ぎてしまいました。来週はIBM ConnectED 2015ですね。

今年はどんな情報が得られるのでしょうか?

さて、今年最初の話題はConnectEDと行きたいところですが・・・違う話です(笑)
では、話題に入る前に
にほんブログ村 IT技術ブログへ
をクリックしてくださいね。


それでは、本題へと。
ハッピーマンデーについて考えてみます。
先日、イケヤマくんもつぶやいていましたが、Notes/Dominoでは休日文書というものがドミノディレクトリにあり、それを更新することでクライアントの休日文書に反映させることができます。
昔は休日は特定の日付が設定されていましたが、最近では「ハッピーマンデー制度」が出来上がったことにより、休日が第n月曜日に設定されるものがあり、特定の日付ではなくなったものがあります。
2015年1月現在で制定されているのは次の4つです。
ハッピーマンデーとして制定されている休日

これらの日付は毎年変わるので、都度実際のカレンダーを見ながら設定しているという人も少なくないのではないでしょうか。
これが自動計算できればとても楽になりますね。ということで、LotusScriptで実現してみましょう。

では第n月曜日というのは何日になるのかを考えてみます。
考えるよりも実際のカレンダーを見てみましょう。こんなものを作成してみました。
第n月曜日が何日なのかが分かるようにしたカレンダー

このカレンダー表から
第2月曜日は 9~14日
第3月曜日は15~21日

を推移していることがわかります。

ただし、カレンダー表を見ても分かるように
第2月曜日の場合
1日が日曜日の場合、 9日
1日が月曜日の場合、 8日
1日が火曜日の場合、14日
1日が水曜日の場合、13日
1日が木曜日の場合、12日
1日が金曜日の場合、11日
1日が土曜日の場合、10日
といった形になり、単純に9~14日ではなく、+1すれば良いという訳にはなっていません。

では、どのように算出すれば良いのかを見ていきましょう。
まず、第n月曜日を算出するのにはどんな情報が必要かを考えます。
1日の曜日が分かれば算出できそうですので、Weekday()関数が使えそうです。
また、各年月の1日を算出する必要があるので、Year関数、Month関数、DateNumber関数も使います。

ここで、@Weekday()関数の戻り値に注目してみます。
日曜日が1、月曜日が2、・・・土曜日が7です。
また、第2月曜日の日付に着目すると、1日が火曜日の時が1番大きい値(14日)になります。
そこでこんな表を作成してみました。
1から7日までのWeekday関数の戻り値

これは、1日が何曜日なのかを基に1日から7日までの各日付のWeekday関数の戻り値を示したものです。
ここで6日の戻り値に着目してみると・・・なんとまぁ、1から順になっています。

ということは、各年月の6日のWeekday関数の戻り値は第x月曜日の日付を算出するのに適しているということが分かります。
実際に表を見てみると、「6日の曜日値」「第二月曜日の日付」を足すと、全部15になっています。

つまり、
15 - Weekday(年月の6日)
という計算式が成り立ちます。

LotusScriptで書いてみると、
Dim yyyy As Integer
Dim mm As Integer
Dim mon As Integer
yyyy = 2015
mm = 1
mon = 15 - Weekday( DateNumber( yyyy, mm, 6 ) )
Msgbox cstr(yyyy) & "年" & cstr(mm) & "月の第2月曜日は" & cstr(mon) & "日です。"

となります。

yyyyとmmは入力させても良いですし、求めたい休日の年月を基に自動計算させても良いでしょう。

これで、毎年カレンダー文書を更新しなくてもよくなります・・・でしょうか。
(実際には春分の日、秋分の日、振替休日等がありますから、毎年更新しないといけないのですが・・・)


たまにはこういう計算式を考えるのも楽しいでしょう。
ちなみに・・・本当は先週初めに書きたかったのですが、自分の中でまとまらなかったので、遅くなりました。
すみませんでした。


では、今日はこの辺で。




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: