見出し画像

今日が祝日かを答えるコマンド

 いろいろなプログラムで年月日や曜日を取得したり、日数計算したりすることはよくありますし、そのための関数なども用意されています。しかし、日本の祝日については、ある程度のルールはあるもののプログラムで容易に認識させにくいので、あらかじめ日付をデータとして持たせるなど個別で対応することになります。結構面倒です

 なにも準備せずにせめて今日ぐらいは祝日なのかぐらいはわかりたいので、今年の祝日を確実に書いていそうなサイトを探したところ、東京証券取引所の休業日一覧を見つけました。
 ここのHTMLを取得して、テキストから今日を検索してヒットすればその祝日を表示するという流れでプログラムを組んでいます。コードはC#で、Windowsのコンソールアプリです。VisualStudio2022を使っています。
 と、ここで祝日といえば総務省なのだから調べてみると「祝日一覧API (date)」というサイトがありました。そこにjsonやCSVが載っていましたので、ここから取得できるように変更しました。総務省のほうが記載されている年月日の範囲が広いようです。

 使い方はコマンドプロンプトから
     whatday
とすると、今日が祝日であれば祝日名を、違えば何も答えません。
     whatday 2022/4/29
などと年月日を与えると、その日が祝日であれば祝日名を、違えば何も答えません。

実行例

 実際の用途は、このまま使うということではなく、何かに組み込むことになると思います。

 ソースコードは以下です。(インデントが崩れています。お許しください。)

using System;
using System.Text.RegularExpressions;
using MSXML2;
namespace WhatDay
{
    internal class Program
    {
    //東京証券取引所
    const string URL1= "https://www.jpx.co.jp/corporate/about-jpx/calendar/";
    const string DATEFORMAT1 = "yyyy/MM/dd";
    const string PATTERN1 = @".+?"">(\S+)</td></tr>";
    //総務省
    const string URL2 = "https://holidays-jp.github.io/api/v1/date.json";
    const string DATEFORMAT2 = "yyyy-MM-dd";
    const string PATTERN2 = @""": ""(\S+)""";


    static void Main(string[] args)
    {
        //これを変更すれば取得するサイトを変えられる。
        string URL = URL2;//=URL1;
        string DATEFORMAT = DATEFORMAT2;//= DATAFORM1;
        string PATTERN = PATTERN2;//=PATTERN1;


        string dstr;
        if (args.Length == 0)
        {
            dstr = DateTime.Today.ToString(DATEFORMAT);
        }
        else
        {
            try 
            {
                DateTime dt = DateTime.Parse(args[0]);
                dstr = dt.ToString(DATEFORMAT);
            }
            catch 
            {
                dstr = "";
            }
        }
        if (dstr.Length != 0)
        {
            string pat = dstr + PATTERN;
            string ret = WebAccess.GetWordFromWeb(URL, pat);
            Console.WriteLine(ret);
        }
        else
        {
            Console.WriteLine("日付が正しくありません。");
        }
        Console.ReadKey();
        return;

    }

    public class WebAccess 
    { 
        public static string GetWordFromWeb(string url,string pattern)
        {
            string web = GetHTML(url);
            Match mch = Regex.Match(web, pattern);
            if (mch.Success)
            {
                return mch.Groups[1].Value;
            }
            else
            {
                return null;
            }
        }
        private  static string GetHTML(string url)
        {
            ServerXMLHTTP60 http = new ServerXMLHTTP60();
            http.open("GET", url, false);
            int lResolve = 60 * 1000;
            int lConnect = 60 * 1000;
            int lSend = 60 * 1000;
            int lReceive = 60 * 1000;
            string ret;
            try 
            {
                http.setTimeouts(lResolve, lConnect, lSend, lReceive);
                http.send();
                ret = http.responseText; 
            }
            catch (System.Runtime.InteropServices.COMException ex)                   
            {
                ret = ex.ToString();
            }
            catch ( Exception ex) 
            {
                ret = ex.ToString();
            }
            return ret;
        }
    }
}
}

#祝日, #C#, #今日は祝日

応援してやろうということで、お気持ちをいただければ嬉しいです。もっと勉強したり、調べたりする糧にしたいと思います。