C#で日付の判定はできますが、祝日の判定は外部から情報を取得しないと実装できなかったのでそのメモとなります
検証環境は以下で実施しています
| 名前 | バージョン | 
|---|---|
| OS | Windows 11 Pro | 
| C# | .Net 8.0 | 
祝日情報の取得先
祝日情報については内閣府のデータから取得します。以下のURLにアクセスするとCSVファイルがダウンロードできます
https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
実際にプログラムに落とし込む
では上記のURLからCSVファイルを取得して、それを基に祝日データを抽出します。今回は日付だけで祝日名(元日や成人の日等)は使用しないためデータから抽出していません
CSVファイルの取得
まずは対象URLからCSVファイルを取得します
string url = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv";
using (HttpClient client = new HttpClient())
{
    HttpResponseMessage response = await client.GetAsync(url);
    // ステータスコードが200以外の場合は例外をスロー
    response.EnsureSuccessStatusCode();
}CSVファイルからデータを抽出
取得したCSVファイルには1955年の祝日からデータが入っているので今回は必要となる年の祝日だけを抽出しています。また、CSVファイルには取得した年の翌年までの祝日が入っています(例:2024年に取得したなら、2025年までの祝日データが入っている)
// ShiftJISを読み込めるようにする
EncodingProvider provider = CodePagesEncodingProvider.Instance;
var encoding = provider.GetEncoding("shift-jis");
// 文字コードをShiftJISを指定してCSVファイルを読み込む
using (Stream stream = await response.Content.ReadAsStreamAsync())
using(StreamReader reader = new StreamReader(stream, encoding))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // CSVの1行目はヘッダーなのでスキップ
        if (line.StartsWith("国民の祝日"))
            continue;
        string[] columns = line.Split(',');
        // 年が一致する祝日のみ取得
        if (columns.Length > 0 &&  columns[0].StartsWith(targetYear))
        {
            holidays.Add(columns[0]);
        }
    }
}注意点
.Net 8.0だとそのまま『shift-jis』が読み込めないので以下のサイトを参考に読み込めるようにしました
- 
									
- 
									【備忘録】C#でShift-JISの文字列を扱う #.NETCore - QiitaShift-JISの文字列を読み込むときに少しはまったので自分用の備忘録としてメモ。 よく見る"Shift-JIS"の文 ... 対象サイトへ移動 
対象の日付が祝日かどうか判定する
最後に対象となる日付が祝日か同課の判定をする
 public bool IsPublicHoliday(string date)
 {
     // 比較のために日付のフォーマットを変換(取得するデータがyyyy/M/dフォーマットのため)
     var targetDate = DateTime.Parse(date).ToString("yyyy/M/d");
     return publicHolidays.Contains(targetDate);
 }実際に使ってみる
var publicHolidays = new DeterminingPublicHolidays("2021");
Console.WriteLine(publicHolidays.IsPublicHoliday("2021/01/01")); // True最後に
今回は祝日の判定を実装しました。また、今回のコードもGitHubにアップしているので参考にしてみてください
- 
									
- 
									BlogSampleCodeProjects/DeterminingPublicHolidays at main · nasuton/BlogSampleCodeProjects · GitHubProject for sample code used in the blog.(Blogで記載しているサンプルコード ... GiHubへ 
会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
- 
									
- 
									アドバンスド・ソリューション株式会社|ADS Co., Ltd.Microsoft 365/SharePoint/Power Platform/Azure による DX コンサル・シス ... サイトへ移動 
 
		 
		 
		 
		 
		 
		 
		 
		 
		 
		 
                            