【C#】C#プログラミングのイディオム(8章)日付、時刻の操作
前回の続き
今回は日付、時刻。 よく使うのは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に書いてある。
月末も昔、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章からは外部ファイルへのアクセス絡みに。
つづく
実戦で役立つ C#プログラミングのイディオム/定石&パターン
posted with amazlet at 18.09.09