祝日の求め方

TIPS
休日はカレンダークラスにあるGetDayOfWeekメソッドを使えば曜日を取得することができます。

祝日にはこのように簡単に取得する方法が共通ライブラリにはありません。

祝日がいつなのかわからないからです。

日本の祝日は「国民の祝日に関する法律」という法律で決まっていますが、実際の日時を政令に委任していたり、この法律自身が改正される可能性もあります。

また、オリンピックのような大きな行事や皇室の慶弔などがあると特別法により変わる場合があるためです。

このため、基幹システムなどは、自前で祝日マスター(または営業日マスター)のデータを自前で保持メンテする実装とすることが多いです。

内閣府のデータから祝日一覧を取得する

祝日一覧などは、内閣府なり国立天文台なりがAPIを公開すればいいのに、なんて議論は何度もあったのですが、その声が届いたのか、CSV形式で公開されたのが2017年のことでした。

ところが、公開されたCSVはコンピュータで処理することをまるで想定してない糞みたいな形式であり、多くのエンジニアから嘲笑と非難とを集めました。

その意見を汲み取ったのか、いつの間にやらフォーマットが修正され落ち着いたと思われた2017年3月に、C#でそれを取得する方法を旧ブログで紹介しました。

それから4年近くが経ち、コードを検証してみると、動きません。大きく3つ異なっていました。

1.取得先のパスがhttpからhttpsに変更されていた。
2.文字コードがUTF8からSJISに変更されていた。
3.日付の形式がyyyy-MM-ddからyyyy/M/dに変更されていた。

つまり、今後も何のアナウンスもなく変更される可能性があることが示唆されます。

CSVファイルの取得先はこちら

https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

アクセスするとこんな内容のファイルが取得されます。

国民の祝日・休日月日,国民の祝日・休日名称
1955/1/1,元日
1955/1/15,成人の日
1955/3/21,春分の日
1955/4/29,天皇誕生日
1955/5/3,憲法記念日
1955/5/5,こどもの日
1955/9/24,秋分の日
1955/11/3,文化の日
1955/11/23,勤労感謝の日
1956/1/1,元日
1956/1/15,成人の日
 :
 :

サンプルコード

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;

    public static class HolidayUtil
    {
        static Dictionary<DateTime, string> dic = new Dictionary<DateTime, string>();

        static HolidayUtil()
        {
            // .Net5でSJISを使う場合に必要
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            // ファイルの中身を取得
            string _path = @"https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv";

            var client = new System.Net.WebClient();
            byte[] buffer = client.DownloadData(_path);
            string str = Encoding.GetEncoding("shift_jis").GetString(buffer);

            // 行毎に配列に分割
            string[] rows = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            // 一行目を飛ばしてデータをディクショナリに格納
            rows.Skip(1).ToList().ForEach(row =>
            {
                var cols = row.Split(',');
                dic.Add(DateTime.Parse(cols[0]), cols[1]);
            });
        }
    }
あとはディクショナリの中身を適当に使いやすいように公開すればOKですね。

さて、問題はこのコードが何時まで使えるか。

サービスが何時まで続くのか、フォーマットが何時まで維持されるのか、データはいつ更新されるのか、取得先のパスはいつ変更されるのか。

何の保証もないのが難しいところ。デジタル庁でも出来たらそちらに移管されるんでしょうか。
TIPS
スポンサーリンク
C#プログラミング再入門