2017年03月12日

祝日の求め方 その2

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

祝日は共通ライブラリからは取れません。いつが祝日かわからないからです。

基本的には「国民の祝日に関する法律」という法律で決まっていますが、常に改正される可能性がありますし、特別法などにより変わってくる可能性があるためです。

そのため、休祝日カレンダーなどが必要となるシステムでは、祝日カレンダー(若しくは営業日カレンダー等)のデータを自前で保持することになります。若しくは内閣府のこちらのページやGoogleカレンダーなどから取得するコードやサービスを用いたりします。

こういうのは内閣府なり国立天文台なりがAPIでも公開すればいいのになんて議論は何度もあったのですが、その声が届いたのか、休日データがCSV形式で公開されました。

最初に公開されたCSVはコンピュータで処理することを前提としない糞みたいな内容であり、こうしたサービスを期待していたエンジニア全員から多くの嘲笑と非難とを集めましたが、その内容を汲み取った形跡が伺えるフォーマットにシレっとなおしてありました。

修正後も問題はあるんですが、とりあえずないよりましですので、これをC#から使う方法の紹介です、

CSVのパスはここです。

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

このパスからデータを読み取るコードは以下になります。

            // add reference to System.Web.dll
            string _path = @"http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv";
            var client = new System.Net.WebClient();
            byte[] buffer = client.DownloadData(_path);
            string str = Encoding.Default.GetString(buffer);

こんなデータが取得されます。

国民の祝日月日,国民の祝日名称\r\n2016-01-01,元日\r\n2016-01-11,成人の日\r\n2016-02-11,建国記念の日\r\n2016-03-20,春分の日\r\n2016-04-29,昭和の日\r\n2016-05-03,憲法記念日\r\n....

改行コードで分割して一行目のタイトルを飛ばして日付と名称の辞書を作るにはこんな感じ

            var dic = new Dictionary<DateTime, string>();

            string[] rows = str.Split(new string[] { Environment.NewLine },StringSplitOptions.RemoveEmptyEntries);

            rows.Skip(1).ToList().ForEach(row =>
            {
                var cols = row.Split(',');

                dic.Add(DateTime.ParseExact(cols[0], "yyyy-MM-dd", null), cols[1]);
            });

ここまでくれば、どうとでも使えますかね?

やはり無理だよなぁ。いつまでサービスが続くのか、フォーマットが維持されるのか、いつデータ変更されるのか、パスは一定なのか、何の保証もないんだもの。

内閣府も折角なので、ちゃんと作ろうよ。みんな期待しているよ。

posted by RR at 18:12 | Comment(0) | Tips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。