C#で日数計算を行うのに、DateDiff関数を使う以外の方法。でも、ぶっちゃけ関数使った方が早いし正確だよ。

投稿日:

C#に限らず、プログラミング言語にはDateDiff相当の関数が用意されているはずです。
Excelでは普通に加減算が可能ですが。
そして、結論を言ってしまうと、そういう関数がある場合、それを使うべきです。

日数の計算って、場合によってはとっても面倒くさいのでw

社内の勤務時間が変動するので、PCへのログイン時間から勤務時間だけを取り出して~みたいな単純な差分のみで終わらないものだったりするので、その時は臨機応変にやるしかないけど・・・

DateDiff関数って何?

ある二日間における日数が取得できます。

例えば、2017年01月01日~2017年12月31日だと365日になります。
こういった日数を返してくれます。

なぜ関数を使うべきなのか?

要は、面倒くさいんです。
日数の計算って。

例えば、うるう年。

うるう年の定義って、パッと言えますか?

うるう年とは、

(1)西暦年号が4で割り切れる年をうるう年とする。

(2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。

(1)と(2)を満たす年になります。

国立天文台(NAOJ)のページより。

https://www.nao.ac.jp/faq/a0306.html

 

先に例としてあげた

「2017年01月01日~2017年12月31日」の日数を計算しようとする場合。
2017年が(1)と(2)の条件に当てはまるかどうかを判定させる必要があります。
1年は365日だろっていうのでごり押しは出来ないんです。

大学の情報課とかだとプログラミングの授業とかでうるう年判定のプログラムを組んだりするかもしれませんね。

うるう年だけじゃない

当然ですが、考慮すべきはうるう年だけではありません。

月ごとの日数も違います。
うるう年は2月の日数が28日から29日になります。
他の月も、6,9,11月は30日。
1,3,5,7,8,10,12月は31日になります。

これらを全て考慮したうえで引き算のプログラムをする必要があります。

正直めんどいw

さっきの例では、丸1年でした。
これが、複数年になると

  • うるう年は何年含まれるか
  • 対象の月は2月かどうか
  • 対象の月は30日か31日か

を考慮したうえで、年数の引き算を行い日数に変換するのに加え、月(12ヶ月単位)と日(28,29,30,31日のどの月か)の筆算みたいなことをすることになります。

大学でプログラムを始めた時に課題でやらされたんですが、面倒くさかったw

まとめ

用意されてるならそれを使った方がいいってだけの話です。

今回、プログラム上の処理で、複数の日付の前後判定を6項目の組み合わせで、計15パターン×取得データ件数分やる必要があったため、日付関連の関数を眺めてて、学生時代を思い出してしまったw

テキストベースでデータもらったから、ちょっちメンドかった。
テキストをフォーマット変更して日付として扱えばいいだけの話なんだけど。







-C#

関連記事

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …

C#でTryParseメソッドを使って文字列が数値かどうかを確認する

C#に限らず、コーディングしていると数値が欲しいのに、引数がstring型とかいう状況がよくあるわけで。 判定方法はいろいろあるけど、TryParseを使うと簡単だった。 TryParseって何するの …

C#で”LC.exe” はコード -1 を伴って終了しました(”LC.exe” exited with code -1)ってエラー

未だに確定した原因は自分で掴めてないんだけど、とりあえずエラーで検索して対策してみた。 どうにも、ビルド時にEXEフォルダ?とかにSRCフォルダからのコピーが上手くいかずにロックされてしまったりすると …

[C#]NumericUpDownコントロールで、上下キーでの値変更を禁止する

結論から言うと、「InterceptArrowKeys」プロパティをfalseにしてやることで解決。 NumericUpDownコントロールを使うメリット 画面構築をしている際、ユーザーの任意入力項目 …

[C#]リストをカンマ区切りの文字列で出力する

リストの項目をカンマ区切りで出力したい 卵が先か鶏が先か~って話じゃないんですが、リストで出力した内容をカンマ区切りのデータにする必要が出てきたので、調べました。 List<string> …


カテゴリー