5

2 つの日付間の完全な日数の計算から 2 月 29 日を除外したいと考えています。間隔のコーナー値を除外します。

テスト シナリオ:

1 March 2012 - 28th February 2012  = should give 0 days.
1 March 2012 - 26th February 2012  = should give 2 days.
1 March 2013 - 28th February 2012  = should give 365 days and not 366 days.
1 March 2017 - 28th February 2012  = should give 365*5 =1825 days and not 1827 days.

現在、私は年を解析し、日付間にうるう年があるかどうかを確認し、間隔が2月29日であるかどうかを確認します。間隔が何年にもわたる場合、特定の間隔に特定の日と発生回数があるかどうかを判断する方法はありますか。

4

4 に答える 4

1

しかし、それは2月29日が原因ではありません、そうです。

2012 年 3 月 1 日と 2012 年 2 月 28 日を比較すると 1 日が返され、29 日は 2 日が返されます。これら 2 つの日付の違いは 1 日です。

希望どおりに 0 日を返すには、2012 年 3 月 1 日と 2012 年 3 月 1 日など、2 つの同じ日付を比較する必要があります。

勘違いしてると思います^^;

于 2012-09-18T11:18:40.827 に答える
0

1年が360日というのは聞いたことはありますが、1年が365日というのは初めてです。

最善の策は、日付の差を日数で計算し、遭遇した 2 月 29 日をすべて差し引くことです。

つまり、日付の範囲を調べて、遭遇した 2 月 29 日の数を返すルーチンが必要です。

JodaTimeでこれを行う方法はわかりませんが、基本的なアルゴリズムは

  • 開始日を 1970 年 1 月 1 日からの日数に変換します。
  • 終了日を 1970 年 1 月 1 日からの日数に変換します。
  • 開始日から終了日まで 1 日ずつループします。
  • ループ日を日付に戻します。
  • 日付が 2 月 29 日の場合、カウンターに 1 を加算します。
  • ループが終了したら、カウンターを返します。
于 2012-09-18T13:28:23.480 に答える
0

JavaScript を使用すると、次のように実現できます。ここで、startDateendDateは JavaScriptDateオブジェクトです。

function calculateDays(startDate,endDate){
    var oneDay = 86400000; //ms per day
    var difference = Math.ceil((endDate.getTime() - startDate.getTime()) / oneDay); 
    var totFeb29s = findTotalFeb29s(startDate,endDate);
    return  parseInt(difference)+parseInt(1)-parseInt(totFeb29s);    
}    
function findTotalFeb29s(startDate,endDate){
    var totalFeb29s = 0;
    var startYear = startDate.getFullYear();
    var endYear = endDate.getFullYear();
    for(var year=startYear;year<=endYear;year++){
        var dt = new Date(year, 1, 29);
        var isLeap = dt.getMonth() == 1;
        if(isLeap==true && startDate<=dt && dt<=endDate){
           totalFeb29s = parseInt(totalFeb29s)+parseInt(1);
        }
    }
    return totalFeb29s;
}    
于 2013-08-28T22:32:17.210 に答える