[2348] Re^3: 祝日を判断するプログラムは作れますか?

投稿日 2019/01/21(Mon) 22:30:16
投稿者 通り道
参照先

こんにちは。

よくあるロジックを用いると、だいたい、以下のような感じになるともいます。
意外と、法令が変わったりするので、つど、ロジックの更新が必要です。
(祝日が増えた・減った程度ならば、ロジックはそのままで、祝日データリストの
更新・追記で対応可能なんですが)
-------
祝日情報とは
 −祝日データリスト:配列={
  {「月日固定」, 1, 1, 1949, 9999, 「元日」},
  {「月日固定」, 1, 15, 1949, 1999, 「成人の日」},
  {「第n月曜」, 1, 2, 2000, 9999, 「成人の日」},
  {「月日固定」, 2, 11, 1967, 9999, 「建国記念の日」},
  {「春分の日」, 3, 0, 1949, 9999, 「春分の日」},
  {「月日固定」, 4, 29, 1949, 1989, 「天皇誕生日」},
  {「月日固定」, 4, 29, 1990, 2006, 「みどりの日」},
  {「月日固定」, 4, 29, 2007, 9999, 「昭和の日」},
  {「月日固定」, 5, 3, 1949, 9999, 「憲法記念日」},
  {「月日固定」, 5, 4, 1988, 2006, 「国民の休日」},
  {「月日固定」, 5, 4, 2007, 9999, 「みどりの日」},
  {「月日固定」, 5, 5, 1949, 9999, 「こどもの日」},
  {「第n月曜」, 7, 3, 2003, 9999, 「海の日」},
  {「月日固定」, 7, 20, 1996, 2002, 「海の日」},
  {「月日固定」, 8, 11, 2016, 9999, 「山の日」},
  {「秋分の日」, 9, 0, 1948, 9999, 「秋分の日」},
  {「月日固定」, 9, 15, 1966, 2002, 「敬老の日」},
  {「第n月曜」, 9, 3, 2003, 9999, 「敬老の日」},
  {「月日固定」, 10, 10, 1966, 1999, 「体育の日」},
  {「第n月曜」, 10, 2, 2000, 9999, 「体育の日」},
  {「月日固定」, 11, 3, 1948, 9999, 「文化の日」},
  {「月日固定」, 11, 23, 1948, 9999, 「勤労感謝の日」},
  {「月日固定」, 12, 23, 1989, 9999, 「天皇誕生日」},
  {「月日固定」, 4, 10, 1959, 1959, 「皇太子明仁親王の結婚の儀」},
  {「月日固定」, 2, 24, 1989, 1989, 「昭和天皇の大喪の礼」},
  {「月日固定」, 11, 12, 1990, 1990, 「即位礼正殿の儀」},
  {「月日固定」, 6, 9, 1993, 1993, 「皇太子徳仁親王の結婚の儀」}
   }

  【自分】で【指定日:文字列】を祝日名取得する手順:文字列
   【結果:文字列】は、自分で指定日を日時形式化したものを祝日名取得する
   結果を返す
  終わり

  【自分】で【指定日:日時形式】を祝日名取得する手順:文字列
   【対象日:日時形式】は、指定日の日付を日時形式化したもの
   【結果:文字列】は、対象日を祝日該当日判定する
   もし、結果が空でなければ、
    結果を返す
   もし終わり
   結果は、対象日を振替休日判定する
   もし、結果が空でなければ、
    結果を返す
   もし終わり
   結果は、対象日を国民休日判定する
   もし、結果が空でなければ、
    結果を返す
   もし終わり
   結果を返す
  終わり

  −【対象日:日時形式】を祝日該当日判定する手順:文字列
   【結果:文字列】は、空
   祝日データリストを【祝日データ:配列】へそれぞれ繰り返す
    祝日データ(1)について分岐
     「月日固定」の場合
      結果は、対象日を祝日データで月日固定判定
     「第n月曜」の場合
      結果は、対象日を祝日データでハッピーマンデー判定
     「春分の日」の場合
      結果は、対象日を祝日データで春分判定
     「秋分の日」の場合
      結果は、対象日を祝日データで秋分判定
    分岐終わり
    もし、結果が空でなければ
     結果を返す
    もし終わり
   繰り返す終わり
   結果を返す
  終わり

  −【対象日:日時形式】を振替休日判定する手順:文字列
   【施行日:日時形式】は、「1973/04/12」を日時形式化する
   もし、対象日<施行日ならば、
    空を返す
   もし終わり
   もし、対象日を祝日該当日判定が空でなければ、
    空を返す
   もし終わり
   【調査日数:整数】は、1
   もし、対象日の年>2006ならば、
    調査日数は、6
   もし終わり
   【調査日:日時形式】は、対象日から1日前
   【振替:文字列】は、空
   調査日数回、繰り返す
    【結果:文字列】は、調査日を祝日該当日判定する
    もし、結果が空でなければ、
     もし、調査日の曜日が「日曜日」ならば、
      振替は、結果
      繰り返しを抜ける
     もし終わり
     調査日から1日引く
    違えば
     繰り返しを抜ける
    もし終わり
   繰り返す終わり
   もし、振替が空でなければ、
    「振替休日([振替])」を返す
   もし終わり
   空を返す
  終わり

  −【対象日:日時形式】を国民休日判定する手順:文字列
   【施行日:日時形式】は、「2003/01/01」を日時形式化する
   もし、対象日<施行日ならば、
    空を返す
   もし終わり
   もし、対象日の曜日が「日曜日」ならば、
    空を返す
   もし終わり
   もし、対象日を祝日該当日判定が空でなければ、
    空を返す
   もし終わり
   もし、対象日から1日前を祝日該当日判定が空ならば、
    空を返す
   もし終わり
   もし、対象日から1日後を祝日該当日判定が空ならば、
    空を返す
   もし終わり
   「国民の休日」を返す
  終わり

  −【対象日:日時形式】を【祝日データ:配列】で月日固定判定する手順:文字列
   もし、対象日が祝日データで対象年でなければ、
    空を返す
   もし終わり
   もし、対象日の月=祝日データ(2)でなければ、
    空を返す
   もし終わり
   もし、対象日の日=祝日データ(3)でなければ、
    空を返す
   もし終わり
   祝日データ(6)を返す
  終わり

  −【対象日:日時形式】を【祝日データ:配列】でハッピーマンデー判定する手順:文字列
   もし、対象日が祝日データで対象年でなければ、
    空を返す
   もし終わり
   もし、対象日の月=祝日データ(2)でなければ、
    空を返す
   もし終わり
   もし、対象日の曜日が「月曜日」でなければ、
    空を返す
   もし終わり
   もし、対象日の日≦((祝日データ(3)-1)*7)ならば、
    空を返す
   もし終わり
   もし、対象日の日>(祝日データ(3)*7)ならば、
    空を返す
   もし終わり
   祝日データ(6)を返す
  終わり

  −【対象日:日時形式】を【祝日データ:配列】で春分判定する手順:文字列
   もし、対象日が祝日データで対象年でなければ、
    空を返す
   もし終わり
   もし、対象日の月=祝日データ(2)でなければ、
    空を返す
   もし終わり
   【年:整数】は、対象日の年
   【日:整数】は、(20.8431 + 0.242194 * (年 - 1980) - (((年 - 1980) / 4)を切り捨て))を切り捨て
   もし、対象日の日=日でなければ、
    空を返す
   もし終わり
   祝日データ(6)を返す
  終わり

  −【対象日:日時形式】を【祝日データ:配列】で秋分判定する手順:文字列
   もし、対象日が祝日データで対象年でなければ、
    空を返す
   もし終わり
   もし、対象日の月=祝日データ(2)でなければ、
    空を返す
   もし終わり
   【年:整数】は、対象日の年
   【日:整数】は、(23.2488 + 0.242194 * (年 - 1980) - (((年 - 1980) / 4)を切り捨て))を切り捨て
   もし、対象日の日=日でなければ、
    空を返す
   もし終わり
   祝日データ(6)を返す
  終わり

  −【対象日:日時形式】が【祝日データ:配列】で対象年する手順:真偽値
   【年:整数】は、対象日の年
   もし、年<祝日データ(4)または年>祝日データ(5)ならば
    ×を返す
   もし終わり
   ○を返す
  終わり
終わり
------

以下が、上記の種類を使用したサンプルプログラムです。
------
【対象日:日時形式】は、「2019/01/01」を日時形式化
【結果一覧:文字列】は、「」
【月退避:整数】は、対象日の月
365回、繰り返す
 【結果:文字列】は、祝日情報で対象日を祝日名取得する
 結果一覧は、結果一覧に「[対象日の日] [対象日の曜日] [結果] 」を加えたもの 
 対象日に1日足す
 もし、月退避が対象日の月でなければ
  結果一覧は、結果一覧に「[改行]」を加えたもの
  月退避は、対象日の月
 もし終わり
繰り返す終わり
結果一覧を表示する
------


関連一覧ツリー

をクリックするとツリーを一括表示します)

返信フォーム

(この投稿に返信する場合は下記フォームから投稿して下さい)
(1MBまで)
(英数字で8文字以内)

- 投稿修正/削除フォーム -
処理 No パスワード

▲ページの先頭へ

- WebForum -