从时间间隔排除2月29日

Hul*_*ulk 5 java date jodatime

我想从两个日期之间的完整日期的计算中排除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.
Run Code Online (Sandbox Code Playgroud)

目前我解析年份并检查日期之间是否有任何闰年,然后检查时间间隔是否为2月29日.如果任何特定区间具有特定日期和出现次数(如果区间跨越多年),是否有任何方法可以确定.

Stu*_*art 2

下面的 Java 式伪代码应该可以工作。如果您愿意,它还允许您添加其他过滤器:

int daysExcludingLeapYearDay(Date start, Date end)
{
    if(end.isBefore(start))
    {
        return filterOutLeapYearDays(daysBetween(end, start)).size();
    }

    return filterOutLeapYearDays(daysBetween(start, end)).size();
}

List<Date> filterOutLeapYearDays(List<Date> days)
{
    List<Date> daysExcludingLeapYearDays = 
             days
             .filter(d -> !isFeb29(d))
             .toList());

    return daysExcludingLeapYearDays;
}

List<Date> daysBetween(Date start, Date end) 
{
    List<Date> days = new List();

    for (Date day = start; day.isBefore(end); day = day.plusOneDay()) 
    {
        days.add(day);
    }

    return days
}

boolean isFeb29(Date date) 
{
    return date.month == FEBRUARY && date.day == 29;
}
Run Code Online (Sandbox Code Playgroud)