restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【C#】C#プログラミングのイディオム(8章)日付、時刻の操作

前回の続き

restofwaterimp.hatenablog.com

今回は日付、時刻。 よく使うのはDateTimeとstringの型変換と 差分を求めることかな。

私が使う時に、元号や曜日というのはあまり使わない。 もっぱら差分比較とか、n日前、n日後を使うことが多い。

     var dt1 = new DateTime(2016, 2, 4); //時分秒は0:00:00
            var dt2 = new DateTime(2019, 3, 2, 12, 22, 11);

            Console.WriteLine(dt1 +":"+ dt2);

            /*getしかプロパティに設定されていない*/
            Console.WriteLine(DateTime.Today); //時分秒は0:00:00
            Console.WriteLine(DateTime.Now);   //時分秒まで設定

            Console.WriteLine(DateTime.Today.DayOfWeek);


            /*日付を文字列に変換*/
            Console.WriteLine(dt1.ToString("d"));

            /*比較は演算子*/
            if(dt1 < dt2){
                Console.WriteLine("dt2の方が新しい日にち");
            }

            /*DateTime型は不変オブジェクトだが、初期設定は可能。差分は新たな変数へ*/
            var future = dt2 + new TimeSpan(2, 30, 0); //TimeSpanで時分秒を加減できる
            Console.WriteLine(future);

            var nextDay = dt2.AddDays(2); //Addxxxで加減したい単位を指定可能
            Console.WriteLine(nextDay);

日付型の表示変換はdocsに書いてある。

docs.microsoft.com

月末も昔、cobolとかやっていた時はうるう年考えて計算していたり、 最近でも、求めたい月の翌月の1日 - 1をして求めていたような。 そんなことしなくても

     var today = DateTime.Today;
            int day = DateTime.DaysInMonth(today.Year, today.Month);
            Console.WriteLine("今月は{0}日ある", day);

DaysInMonthメソッドを使えば、指定した年月の日数を求めてくれるので、月末日を求められます。

8.5 日時の計算(応用)

には、DayOfWeek列挙型を利用し、曜日から日付を求めるテクニックが記載されている。

DayOfWeekを利用することで、次のx曜日の日付を求めることができる。

       /*DayOfWee.xx で曜日ごとに値を持っている。列挙型で、日曜日から0,1,2,3,と始まる*/
            var days = (int)DayOfWeek.Monday - (int)(today.DayOfWeek);
            if (days <= 0) days += 7;
            Console.WriteLine(today.AddDays(days));

この章の最後に「プログラミングには唯一の正解はない」と描かれているが、その通りと思う。 機能として動けば、読みやすい・わかりやすいコードも、わかりにくいコードも同じ。 しかし、後々のことを考えると、わかりやすいコードでかつ、効率的、速度があるコードへ 徐々に書き換えた方がよい。

そこらへんはこの書籍だけでなく、他の良書に当たって、対応するのがよいかと。

次の章からは実践編 9章からは外部ファイルへのアクセス絡みに。

つづく