ディーバ Blog

大阪発 C#の会社、株式会社ディーバの Blog です。

C# で日本の祝日を取得

C# で日本の祝日を扱います。

f:id:jz5_diva:20170208121003p:plain

取得しない

もっとも簡単で処理的にも速いのは、あらかじめ登録しておくことですよね。常にメンテナンスするような Web サービスであれば、これが一番いいかも。実際、大手グループウェアで数年先のカレンダーを見ると祝日が未設定だったりします。

var holidays = new HashSet<DateTime>()
{
    new DateTime(2017, 1, 1),
    new DateTime(2017, 1, 2),
    new DateTime(2017, 1, 9),
    new DateTime(2017, 2, 11),
    new DateTime(2017, 3, 20),
    new DateTime(2017, 4, 29),
    new DateTime(2017, 5, 3),
    new DateTime(2017, 5, 4),
    new DateTime(2017, 5, 5),
    new DateTime(2017, 7, 17),
    new DateTime(2017, 8, 11),
    new DateTime(2017, 9, 18),
    new DateTime(2017, 9, 23),
    new DateTime(2017, 10, 9),
    new DateTime(2017, 11, 3),
    new DateTime(2017, 11, 23),
    new DateTime(2017, 12, 23),
};

Google カレンダーを利用

でもメンテしたくない、実装も簡単にしたいってことで、Google カレンダーから祝日を得るようにしてみます。Google Calendar API を使って祝日を取る PHP編 - Qiita を参考にして、C# で書いて見ました。

Newtonsoft.Json を利用しています。API については元記事を参照してください。

public static async Task<HashSet<DateTime>> GetHolidaysAsync(int year)
{
    var key = "API_KEY";
    var holidaysId = "japanese__ja@holiday.calendar.google.com";
    var startDate = new DateTime(year, 1, 1).ToString("yyyy-MM-dd") + "T00%3A00%3A00.000Z";
    var endDate = new DateTime(year, 12, 31).ToString("yyyy-MM-dd") + "T00%3A00%3A00.000Z";
    var maxCount = 30;

    var url = $"https://www.googleapis.com/calendar/v3/calendars/{holidaysId}/events?key={key}&timeMin={startDate}&timeMax={endDate}&maxResults={maxCount}&orderBy=startTime&singleEvents=true";
    var client = new WebClient() { Encoding = System.Text.Encoding.UTF8 };
    var json = await client.DownloadStringTaskAsync(url);
    client.Dispose();

    var o = JObject.Parse(json);
    var days = o["items"].Select(i => DateTime.Parse(i["start"]["date"].ToString()));
    return new HashSet<DateTime>(days);
}

次のように使うと最初のコードと同じ結果が得られます。

var holidays = await GetHolidaysAsync(2017);