うるう日の判定方法について

いつもお世話になっております。
特定の期間内にうるう日が含まれるかどうかの判定をしたいです。
スタート日とエンド日をそれぞれ比較して判定、という形で行おうとしたのですが、
2つの日付の前後関係の比較方法がわからず行き詰っております。
なにか良い方法をご存知の方、ご教授いただけませんでしょうか。

DateTime型には、 .IsLeapYear(Int32)と言う、閏年かどうかを判断するメソッドがあります。スタート日の年情報~エンド日の年情報で調べて見て、閏年の可能性のある年だったら、月日を詳細に比較して見ては如何でしょうか?

3 Likes

HANACCHIさんありがとうございます
こんなメソッドあったんですね!
引き続き自分で調べていてCompareToメソッドをみつけたので、
組み合わせて試しに以下のような流れでつくってみたのですが、
1.スタート日年かエンド日年のどちらかがうるう年か判定
2.判定にヒットした年を取得しうるう日を決定
3.スタート日年がうるう年ならスタート日<うるう日かをチェック
4.エンド日年がうるう年ならうるう日<エンド日かをチェック

この判定方法だと期間が1年以上でかつスタートエンド共にうるう年でない場合に検知ができないという欠点があります。
比較するのに必要な「直近のうるう日」を取得することができればクリアできるのですが、
何かいい方法はありませんでしょうか・・・

こんにちは

実現したいことの要件にもよりますが、うるう日は固定的でかつ仮に100年間で見てもたかだか二十数個しかないので、あらかじめ必要とされるうるう日のリスト(配列)を用意しておいて、それと比較するのが簡単なように思えます。

例えば要件的に2012年から2040年までを考慮すればよい場合は

leapDates = {new DateTime(2012,2,29),new DateTime(2016,2,29),new DateTime(2020,2,29),new DateTime(2024,2,29),new DateTime(2028,2,29),new DateTime(2032,2,29),new DateTime(2036,2,29),new DateTime(2040,2,29)}

としておいて

leapDates.Any(function(x) x>=fromDate AndAlso x<=toDate)

で判定できます。ここでfromDate, toDateともにDateTime型です。
なお上記は時刻に関してはややあいまいですので、必要に応じて事前にfromDateやtoDateを午前0時にしておく必要があります。

1 Like

ちょっと簡単ではなかったですね?

考え方を変えて、開始年~終了年までに、閏日が何日あるかを計測するようにしてみました。

ご笑覧くださいませ。

うるう日の判定方法について.zip (15.0 キロバイト)

中のアクティビティに注釈をいれてあります。
また、検証に使用したEXCELファイルも同梱してありますので、そのまま動かせると思います。

1 Like

少し日数が開いてしまいましたが、ありがとうございます
Yoichiさん
かなり悩んで作った(不完全でしたが)アクティビティがたった1行で解決してしまうとは・・・
すごいですね
Linqでこのような比較ができるのは驚きでした

HANACCHIさん
ありがとうございます。活用させていただきます。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.