祝日を判断するプログラムは作れますか?

投稿者:K.H 投稿日:2019/01/19(Sat) 14:18:02 No.2342

時刻表を発車標(駅のコンコースにある電光掲示板)のような形式で閲覧できるソフトを作ったのですが、休日ダイヤが存在する場合の対策として、曜日を文字列で表すことができる機能を使用し、土曜日あるいは日曜日なら休日ダイヤの時刻表を表示させる というプログラムを自分なりの構文で作りました。しかし、祝日などの変則的に入る休日は曜日の文字列で判断することができないためどうするか考えています。
インターネットに接続していない状況で、今日が祝日(休日)かどうかを判断できるプログラムを作成することは可能でしょうか?

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

投稿者:左膝が痛い人 投稿日:2019/01/19(Sat) 18:58:55 No.2344

こんにちは。
ここのルールなので挨拶は書いたほうがいいですよ。質問のことで頭がいっぱいだと思いますので気持ちはわかりますが。。。

> インターネットに接続していない状況で、今日が祝日(休日)かどうかを判断できるプログラムを作成することは可能でしょうか?

インターネットに接続してないなら、自分で祝日の日付をまとめておいて、今日が祝日なのか判定すればいいのではないでしょうか。
テキストファイルにまとめるなり、配列にまとめるなりで対応できるかと思います。

例として、配列を使った方法を記載してみます。

// プログラム例 ここから //

祝日一覧は、{「1/1」、「1/14」、「2/11」、「3/21」、「4/29」、「4/30」、
「5/1」、「5/2」、「5/3」、「5/4」、「5/5」、「5/6」、「7/15」、「8/11」、「8/12」、「9/16」、「9/23」、
「10/14」、「10/22」、「11/3」、「11/4」、「11/23」、「1/19」}//動作確認用に本日の日付を最後に入れてます

判定日は、「[今日の月]/[今日の日]」
結果は、祝日一覧から判定日を探す
もし、結果(1)が1以上なら、
  「[判定日]は、祝日です」を表示する
違えば
  「[判定日]は、祝日ではないです」を表示する
もし終わり

// プログラム例 ここまで //

本来は、祝日の一覧表をファイルで管理したほうが便利だと思います。
以上です。

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

投稿者:K.H 投稿日:2019/01/19(Sat) 20:26:34 No.2345

> こんにちは。
> ここのルールなので挨拶は書いたほうがいいですよ。質問のことで頭がいっぱいだと思いますので気持ちはわかりますが。。。


改めてこんにちは。 挨拶もせずいきなりお話を持ち掛けて申し訳ありませんでした。
> インターネットに接続してないなら、自分で祝日の日付をまとめておいて、今日が祝日なのか判定すればいいのではないでしょうか。
やはりインターネット環境を想定しない場合ですとあらかじめ用意となりますよね...
わざわざプログラム例文まで書いていただきありがとうございます。非常に参考になりました。

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

投稿者:通り道 投稿日:2019/01/21(Mon) 22:30:16 No.2348

こんにちは。

よくあるロジックを用いると、だいたい、以下のような感じになるともいます。
意外と、法令が変わったりするので、つど、ロジックの更新が必要です。
(祝日が増えた・減った程度ならば、ロジックはそのままで、祝日データリストの
更新・追記で対応可能なんですが)
-------
祝日情報とは
 −祝日データリスト:配列={
  {「月日固定」, 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日足す
 もし、月退避が対象日の月でなければ
  結果一覧は、結果一覧に「[改行]」を加えたもの
  月退避は、対象日の月
 もし終わり
繰り返す終わり
結果一覧を表示する
------

通り道 さん

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/01/21(Mon) 22:53:43 No.2349

こんばんは。アークです。

何か凄い事になっていますね。
私もカレンダーを作成した時に祝日対応を考えてのですが、
ロジックもさることながらメンテナンスが必要なので諦めました。
しかし、実際に遣るとこんな事になるのですね。
とても参考になりました。

私は昔の祝日の方が分かり易くて好きです。

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

投稿者:K.H. 投稿日:2019/02/11(Mon) 16:29:02 No.2377

こんにちは。
凄いことになっていますね、このプログラム(笑)
こんな風にして処理させることができるということでとても参考になります。ありがとうございます。

▲ページの先頭へ

- WebForum -