お試し プログラム 技術

祝日の判定を実装する

C#で日付の判定はできますが、祝日の判定は外部から情報を取得しないと実装できなかったのでそのメモとなります
検証環境は以下で実施しています

名前バージョン
OSWindows 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 - Qiita
【備忘録】C#でShift-JISの文字列を扱う #.NETCore - Qiita

Shift-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 · GitHub
BlogSampleCodeProjects/DeterminingPublicHolidays at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

GiHubへ

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社
アドバンスド・ソリューション株式会社

アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...

サイトへ移動

-お試し, プログラム, 技術
-,