【 2016年9月15日  サイト 移転のお知らせ 】
      AddinBox サイトを [ DION ] から [ さくら インターネット ] へ移転しました。  なお、旧サイト は 2017年10月 まで残します。
      この ページ の 移転先 URL  ⇒⇒  http://addinbox.sakura.ne.jp/holiday_logic_Bunsan.htm  
 
ロゴ(青) ロゴ(緑)

【 休日分散化 】の問題点と対策(祝日ロジック の検討) ( 祝日ロジック解説ページ

(2010/3/11 作成)

現在、『祝日の分散化』の議論が行なわれています。その要点は以下の通りです。

  (1) 以下の現行 6 祝日を「休日としない記念日」に変更する。
            憲法記念日(5月3日)、みどりの日(5月4日)、こどもの日(5月5日)
            成人の日(1月第2月曜)、海の日(7月第3月曜)
            敬老の日(9月第3月曜)、体育の日(10月第2月曜)
      その際、成人の日/海の日/敬老の日/体育の日についてはハッピーマンデー規則を廃止
      して、従来の日付(各々、1月15日/7月20日/9月15日/10月10日)に戻す。
      (補) 当初の案では、憲法記念日 が含まれていましたが、最新の案では 憲法記念日 が
            外されて、代わりに 成人の日 が組み込まれました。

  (2) 上記 6日分の休日を3日ずつに分け、5月と10月の『月曜〜水曜(または 水曜〜金曜)』
      に3連休として配置する(意味のある祝日ではなく、"国民の休日"となるでしょう)。

  (3) 3連休の配置は、全国を5ブロックに分け、ブロックごとに週を変えて割り振る。

  参考資料 : 観光庁/休暇分散化ワーキングチーム / 休日分散化パターン


成立の行方は不透明ですが、野党時代の主張に蓋をして『普天間移設で、民意がどうであろうと
お願いする事は充分有り得る』などと臆面もなく言い切るような人が官房長官をやっているところ
ですから、どんなに反対意見が多かろうが「観光業界の為だけ」に推し進めそうな気もします。

この法案には大反対なんですが、成立した場合、祝日ロジックに対する影響が非常に大きい為、
万が一成立した場合に備えて、祝日ロジックの面から問題点と対策について検討してみます。

なお、ここで取り上げる『問題点』とは、プログラム化する上で懸念されるもののみです。「祝日の意
義が失われる。成立の経緯・趣旨を蔑ろにしている」などといった根源的な問題点は扱いません。


(問題点-1)  [ 対策 ]
    祝日法で規定される祝日に、「休日となる」ものと「休日とならない」ものが混在する。

    prv祝日/ktHolidayName は、「祝日名 or 空文字("")」を返却値としています。現在は「祝日
    イコール休日」である為、「祝日名 or 空文字("")」という結果が、そのまま「休日 or 休日では
    ない」というフラグ情報としても機能しています。

    この「祝日名 or 空文字("")」--同義--「休日 or 休日ではない」という関係を維持しようとする
    場合、改正法施行日以降には "こどもの日" などの判定を止めて名称を返さない(空文字)よ
    うにする事となります。

    しかし、カレンダーレイアウトの作成という面から考えると、「引き続き、"こどもの日" などの暦注
    表記を行ないたい」という要求があろうと思います。この場合には、祝日名と一緒に休日フラグの
    情報を返却値に持たせる必要がありますので、その持たせ方に検討が必要です。

    休日フラグ用と暦注表示用とで分けて関数を2本立てにする方法もありますが、9割方同じコード
    の関数を作成するのは無駄であり、修正漏れなどの悪影響も有り得ますので、2本立て方式は
    除外します。

(問題点-2)  [ 対策 ]
    全国5ブロックで分散休日の日付が異なる。

    今までは全国一律でしたから「日付」のみで判断できましたが、改正法施行後には分散祝日に
    よる3連休の日付が地域で異なるため、日付と一緒に【地域】の指定が必要となります。

(問題点-3)  [ 対策 ]
    分散祝日を実際に休日とするかが業界/企業によって不透明

    祝日判定関数の拡張版として、「年末年始+土日」を組み合わせて、[銀行休日/官公庁休日]
    関数の作成方法、および、それを利用した[営業日算出/営業日数算出]関数(こちら)を紹介
    していますが、銀行業界(もしくは個々の金融機関)や各地の官公庁によって【分散祝日】の扱
    いがバラバラとなる可能性もあり、そうすると【地域】の引数追加だけでは対応できなくなります。

(問題点-4)  [ 対策 ]
    「振替休日」の消滅

    憲法記念日(5月3日)・みどりの日(5月4日)・こどもの日(5月5日)が『休日ではない』記念日
    となりますので、当然、この3祝日が日曜に当たっても【振替休日】にはなりません。

    また、前回の「昭和の日」改正で修正された振替休日条項
          第三条第二項 : 祝日が日曜にあたるときは、その日後において、
                                その日に最も近い「国民の祝日」でない日を休日とする
    に該当して追加されたのは、5月6日(火曜日、5/4が日曜)・5月6日(水曜日、5/3が日曜)の
    2件ですが、この振替休日もまた消滅する事になります。

(問題点-5)  [ 対策 ]
    「9月の国民の休日」の消滅

    「敬老の日」が元の日付(9月15日)に戻って、休日ではない記念日となりますので、「秋分の日」
    と挟み込んで出来る「9月の国民の休日」も消滅することになります。

(問題点-6)  [ 対策 ]
    「休日となる祝日」と「分散休日」の日付重複

    休日分散化パターンを見ると、分散休日が「祝日/祝日でなくなる記念日」と重なるケースが有り
    得るようです。その場合にはどうすれば良いのでしょう?

    春の分散休日は「5月3〜5日」の週を避けて「5月第2月曜日」から始めるようですので重なる事は
    ありません。

    秋の分散休日は、春とは異なり、「10月第1月曜日」から始めるようです。そうすると、
      ・ 記念日に格下げとなる「体育の日(10/10)」が、第1 or 第2ブロックの分散休日と
        重なる事があります。
      ・ 5週に分けて割り振る場合に、第5ブロックの分散休日が「文化の日(11/3)」と重な
        る事があります(分散化パターン B-1案 参照)。

    「体育の日」の重なり問題は、暦注の表示をどうするかだけです(これもプログラム的には、どう対処
    して良いか悩む問題ではあります)。

    しかし、「文化の日」の重なり問題は、「休日となる祝日」と分散休日とのバッティングです。その結果、
    九州・沖縄・中国・四国のみ年間休日が【1日少ない】という事になります。これは大問題でしょう。

    「文化の日」の振替休日を翌[木曜日]に設置するという方法も有り得ますが、今度は、
        ・ 「九州・沖縄・中国・四国」だけ4連休(月曜〜木曜)が有り得る
        ・ 他の地域は3連休(月曜〜水曜)固定
    というのでは、これもまた不公平な問題でしょう。尚、この場合には第3条2項の修正も必要になります
    (現法では、振替休日の設置は「日曜日」との重なりの場合に限ります。また、”祝日”に対する適用
    の文言となっていますので、祝日ではない分散休日にも適用可能な文言に変更する必要があります)。

(問題点-7)  [ 対策 ]
    「分散休日」日程の決定/定義方法

    現在は、どういった形態で実施するのか未だ決まってすらいませんが、一番懸念しているのは、
    「春分/秋分の日」のように、

        【 分散休日の日程が、前年の官報による公示で定められる

    という事になりはしないかという事です。

    「春分/秋分の日」は国立天文台が発表する天文上の春分日/秋分日を採ることになっています。その
    天文上の春分日/秋分日は計算で求める事ができるので、官報公示前でも予め日付が判ります。した
    がって、「春分/秋分の日」は官報公示によるとはいってもプログラム化が可能なのです。

    しかし、分散休日の方には、そんな公式はありません。あくまで人の都合によるものとなるでしょう。つまり、
    何の規則性もなく、年によって「第1月曜」から始まったり、「第2月曜」から始まったりと一定しない事になっ
    たら、もう プログラム化は不可能です。仮に暗黙的に「第2月曜から始める」となったとしても、法律上で官
    報公示とされた以上は100%の保証はありませんので、プログラム上で固定化させるのは問題があると思
    います。



下記は、[平成22年3月11日]現在で思い付いた対策案です。今後修正が入る事もありえます。
実際にプログラムのコード修正を行なうのは法案成立の目処が立ってからになります。

(問題点-1 への対策)
    返却値を『休日フラグ と 祝日名』の配列にする方法も考えられますが、配列による返却値という
    処理が言語によっては扱いが異なるでしょうから、この方法は採りません。

    祝日名の前に1文字の記号を付けて休日フラグを表現するのが一番簡単でしょう。どの言語にも
    Left/Mid関数というのはありますので、1文字目と2文字目以降の分割は容易です。

    休日フラグ記号の案
        "!" : 祝日ではない
        "+" : 休みになる祝日
        "-" : 休みにならない祝日
    感嘆符("!")は、一部の言語で『否定演算子』として使われていますので、【 Not : 祝日でない】
    という意味を表現するのに相応しいと思い決めました。

    "N" ( Not Holiday ) , "H" ( Holiday ) , "A" ( Anniversary ) というアルファベットの記号も考えら
    れますが、英語版ロジックも提供しており、アルファベットでは祝日名と記号との区別/境界が見た
    目ハッキリしませんので、日本語版でも英語版でも共通して判り易い上記の3文字を使う事とします。

    (例) 1月1日: "+元旦"  ,  4月29日: "+昭和の日"  , 5月5日: "-こどもの日"
           分散祝日: "+国民の休日"  ,  振替休日: "+振替休日" 
           祝日ではない日: "!"

    補: この機会に、返却値をフラグ情報としている『 C , C# , Perl , AWK 』も「祝日名」返却に変更
          していきたいと思います。

(問題点-2 への対策)
    ブロックエリアを指定する引数の追加は避けられないでしょう。
    それでは、ブロックエリアを、どういった情報で指定させるかですが、以下の3つが考えられます。
        (a) 5つのブロックエリアに対して、1〜5 もしくは A〜E の番号/記号を割り当てて指定する。
        (b) 都道府県名を指定し、関数内で都道府県名からブロックエリアを決定する。
        (c) 都道府県コード(1〜47)を指定し、関数内で都道府県コードからブロックエリアを決定する。

    この3つの指定方法のどれが最適かは決められないでしょう。利用側のユーザープログラムの造り
    によって、「この指定方法の方がやり易い」というのは変わってきます。

    したがって、追加する1つの引数で上記3種類全ての指定方法をサポートできるようにするのが
    ベストだと思います。そうすると、ブロックエリア番号が『1〜5』では、都道府県コード(1〜47)と
    被りますので、A〜E の文字でブロックエリアを指定する事にします。

    数字/文字列の混在ですので本来はVariant型が良いのですが、言語によって扱いも異なるでしょう
    から、引数の属性は文字列(String型)で統一する事とし、[prv祝日]内で以下の順でチェックを行な
    いブロックエリアを決定します。
        (i)    "A"〜"E"
        (ii)   数字("1"〜"47")⇒数値変換
        (iii)  上記以外は[都道府県名]テーブルとチェック

    祝日判定を【1回】行なうだけならば、上記対応だけで充分なのですが、営業日数計算を行なう場合
    には、祝日判定が連続して何十回・何百回と実行されます。その度に都道府県テーブルの検索を
    行なっていたのでは非常に非効率で無駄です。

    そこで、都道府県コード/都道府県名からブロックエリアコード("A"〜"E")に変換するだけの関数を
    別途用意して、営業日数計算関数ではブロックエリア引数(ブロックエリアコード or 都道府県コード
    or 都道府県名)を、その関数に通してブロックエリアコード("A"〜"E")に変換したものを保存して、
    ループ内の祝日判定関数にはブロックエリアコード("A"〜"E")を渡すようにします。そうすれば無駄
    な処理を省く事ができます。

(問題点-3 への対策)
    官公庁は、その地区のブロックの3連休を休みとすると思われますが、金融機関の場合には、全国
    統一で3連休を休まずに全店舗が通常営業とするのが最も混乱が無く一番可能性が高いのではな
    いでしょうか。

    そうすると、『何れの分散祝日3連休も休日としない』という指定が必要となりますが、これはブロック
    エリア引数にブロックエリアを指定せず空文字("")とする事で指定できます。

(問題点-4 への対策)
    通常の振替休日については、
        指定日が「祝日ではない(空文字:"")」&「月曜日である」場合に、
        前日の日曜日に対して再判定し、「祝日(空文字ではない)」ならば”振替休日”
    というロジックで行なっています(ktHolidayName 内)。

    前記の対策で休日フラグが付いてきますので、この条件を
        指定日が「祝日ではない(休日フラグ= "!" )」&「月曜日である」場合に、
        前日の日曜日に対して再判定し、「休日となる祝日(休日フラグ= "+" )」ならば”振替休日”
    と修正する事で対処できます。

    5月6日(火曜日、5/4が日曜)・5月6日(水曜日、5/3が日曜)の2件については、一般の祝日と同様
    に [ prv祝日 ]内で処理していますので、そこに施行日前日までを『有効期間』とする条件を付け加え
    れば済みます。なお、5月6日(月曜日、5/5が日曜)は通常の振替休日として処理していますので、
    上記の修正で除外されます。

(問題点-5 への対策)
    祝日ロジックで採用している「9月の国民の休日」の簡易判定法
          『 翌日が、「秋分の日」&水曜日 』
    では、「敬老の日」を直接利用していませんので、「敬老の日」が休日でなくなる(or 9月15日になる)
    という事の波及効果で自動的に消滅するという事はありません。したがって、施行日前日までの『有効
    期間』条件を付け加えて対処します。

(問題点-6 への対策)
    検討中


(問題点-7 への対策)
    これは打つ手なしです。「官報公示による」という形態にならないように祈るしかありません。




[ 祝日ロジック へ戻る ] [ Home へ戻る ]

ロゴ(ゴールド)   ロゴ(ゴールド)

角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2010 Allrights Reserved.