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#

関連記事

[C#]文字を繰り返したものを取得したい。

いちいちfor文とかで繰り返すのも効率が悪いなと思ってたので、処理を関数化・・・ ただ、共通関数として登録しないので、別のところで使いたい場合は、同じ関数が複数登録されちゃうことに・・・ 更には、思い …

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

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

ADO.NET Entity Data Model をOracleで使う

かれこれ数ヶ月のエラー 以前、会社のノートPCのHDDをSSDに変えたわけですが、それからずっと、あるエラーに悩まされておりまして・・・ その内容は、 エラー 175: 不変名が ‘Ora …

ORACLEでORA-01861: リテラルが書式文字列と一致しません

ORA-01861: リテラルが書式文字列と一致しません このエラー、ぶっちゃけ、意味が分からないところでもある。 日付の指定時に発生してて、原因が判明するまでに結構回り道をしました。 ネットで検索し …

[Oracle]破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。

破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。 破棄されたオブジェクトかどうかの判断(MSDK) MSDNでも破棄さ …


カテゴリー