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#]DateTimePickerは、CloseUpイベントで日付変更を取得する

日付関連で、取得した値がどうか?ってのを検出して判定する必要が出たのでメモ。 CloseUpイベントで何が判定されるのか? https://msdn.microsoft.com/ja-jp/libra …

devenvを使って、プロジェクトをコマンドラインからビルドする方法[VisualStudio]

今日も今日とて休日出勤\(^o^)/   現在、C#をメイン言語として使用しています。 で、当然というか、開発の区切りだったり、テストするためにビルドというものをやります。 このビルド、プロ …

C#:ソースコードのブロック化は必要?

こんにちは、ブロック化の必要性が理解できないSEもどきですw 皆さんは使ってますか? と、さも開発職の人がこのブログに来てるような書き出しですが、個人的に、このブロック化、使いづらいんですよね。 上手 …

C# OracleDbAccessを使用して、SQL実行時にORA-00911 文字が無効です のエラー

表題のとおり、C#でOracleDbAccessを使用して、SQLを実行させる時に発生しました。 ネットで探すと、 全角スペースが原因 とか出てきたので、SQL内のスペースを全て半角スペースに置き換え …

Visual Studio 2008 が重い件について(暫定対応)

現象 とにかく重い。 重いと一言で言うけど、重いという内容は色々含んではいる。 起動が遅い スクロールすらカク付く 右クリックのコンテキストメニューが表示されるまで数秒待たされる 定義の移動に時間がか …


カテゴリー