C# 平日の日数を求める方法 【DateTimeで解決!】

新米太郎
新米太郎

皆さんこんにちは新米です。

この記事を書いたきっかけ(雑談)

昔々。。
会社の同僚が上司からC#で「簡単な勤怠アプリ」を作れと課題を告られたよ。

そこで「平日の日数を求める方法を教えてっ!」と言ってきたので
今回、C#で月の平日が何日あるか求める方法を考えてみたよ。

平日の日数を知りたかったのは、「所定労働時間」を求めたかったからだそう。。

フローチャートでまずは考えてみた。

いきなりコードを書くのではなくフローチャートで処理の流れを考えてみよう!

DateTimeで解決!平日の日数を求めるコード

日付や時刻を使う機会がある時はDateTimeを使用します。
フローチャートを踏まえてコードを見てみましょう。

using System;


class test{
    
    static void Main(){
       
    int year = DateTime.Today.Year; //..①
    int month = DateTime.Today.Month;  
    int countWeekdays = 0; 
       
    for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++){ //..②
            
        DateTime thisDay = new DateTime(year, month, i); //..③

        if (thisDay.DayOfWeek != DayOfWeek.Saturday && thisDay.DayOfWeek != DayOfWeek.Sunday){ //..④

            countWeekdays += 1; //..⑤
        }
    }
    Console.WriteLine(countWeekdays); //..⑥
    }
}

実行結果 ※2021年の4月の結果

22

 

本当に2021年の4月の平日が22日分あるか確認してみると。。。

ぴったり22
正しい処理ができてそうですね。

解説

①int型の変数year,month,countWeekdaysに今年、今月、0(平日をカウントする為)を設定しています。

②ループでは、yyyy年mm月の日数分③④⑤の処理を繰り返します。

③DateTime型の変数thisDayに年月日を代入しています。

④ifで平日か判定しています。 thisDayの年月日が土曜と日曜の場合はfalseになるため、カウントはスキップされます。

⑤判定結果がtrueの場合、countWeekdaysに平日をカウントします。

⑥ループを抜けた後、カウントした日数を出力します。



オブジェクト指向を利用したコード

上で紹介したコードでは、月の休日を求めるロジックでした。

ただし、求めたい平日の日数が今月でない場合はプログラムを書き直さなければなりません。

しかし、オブジェクト指向を利用すれば、異なる月・異なる型でも、それらを意識することなく休日を求めれます

 

せっかくなので、オブジェクト指向を利用し汎用性を持たせた書き方をしてみましょう!

using System;

class test
{

    static void Main()
    {
        //DateTime型を渡す
        CalcDate calcDate1 = new CalcDate(DateTime.Today);
        //数値で年、月を渡す
        CalcDate calcDate2 = new CalcDate(2021,5);


        Console.WriteLine(calcDate1.CountWeekDays());
        Console.WriteLine(calcDate2.CountWeekDays());
    }
}
class CalcDate
{
    int year;
    int month;

    public CalcDate(int year, int month)
    {
        this.year = year;
        this.month = month;
    }

    public CalcDate(DateTime dt): this(dt.Year, dt.Month) { }

     /// <summary>
     /// 平日をカウント
     /// </summary>
     public int CountWeekDays()
    {
        int weekdayCnt = 0;
        for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++)
        { 

            DateTime day = new DateTime(year, month, i); 

            if (IsWeekday(day))
            {
                weekdayCnt += 1; 
            }
        }
        return weekdayCnt; 
    }
    
    /// <summary>
    /// 休日か判定
    /// 平日ならTrue 休日ならFalse
    /// </summary>
    private Boolean IsWeekday(DateTime day)
    {
        if (day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday)
        {
            return true;
        }
        return false;
    }
}

実行結果 ※2021年の4月と5月の結果

22
21

どうでしょうか?

数値でもDateTime型でも意識することなく平日の日数を求めることが出来ましたね!

まとめ

いかがだったでしょうか。

今回は月の平日の日数を求める方法でした。

他にも祝日を除いた平日を求める方法や1年間の平日や休日の日数を求める方法なども
紹介したコードを参考に考えてみれば、求めることができると思います。

是非チャレンジしてみてください!

フローチャートの作成はdraw.ioがおすすめ!

新米太郎
新米太郎

最後まで読んでくれてありがとう!

コメント

タイトルとURLをコピーしました