9

to 日付の期間に 2 月 29 日が含まれているかどうかを確認したいと考えています。

private static final MonthDay LEAP = MonthDay.of(Month.FEBRUARY, 29);

私は試した:

if (LEAP.isAfter(beginDate) && LEAP.isBefore(maturity)) {

    }

ただしbeginDate、 andmaturityは型からであるLocalDate ため、メソッド.isAfterand.isBeforeは使用できません。

beginDate15.01.2012
maturityは 20.01.2013 です

この期間中、2月29日が存在します

解決

私は最終的に解決策を見つけました:

for (int i = beginDate.getYear(); i <= maturity.getYear(); i++) {
    final Year year = Year.of(i);
    if (year.isLeap()) {
        if (beginDate.compareTo(LEAP.atYear(i)) <= 0 || maturity.compareTo(LEAP.atYear(i)) >= 0) {
            minMaturity.plusDays(1);
        }
    }
    return false;
}
4

5 に答える 5

3

TemporalAdjuster1 つの方法は、次の 2 月 29 日を返すを作成し、maturityその日付より前か後かを確認することです。例 (テストされていません):

public static TemporalAdjuster nextOrSame29Feb() {
  return temporal -> {
    LocalDate input = LocalDate.from(temporal);
    if (input.isLeapYear()) {
      LocalDate feb29 = input.with(MonthDay.of(FEBRUARY, 29));
      if (!input.isAfter(feb29)) return feb29;
    }
    for (int year = input.getYear() + 1; ; year++) {
      if (Year.isLeap(year)) return LocalDate.of(year, FEBRUARY, 29);
    }
  };
}

コードは次のようになります。

boolean contains29Feb = !maturity.isBefore(beginDate.with(nextOrSame29Feb()));
于 2014-10-16T14:37:55.923 に答える
1

と をそれぞれtoDateTimeAtStartOfDaytoDateTimeを使用して変換しようとしLocalDateましたか?MonthDayDateTime

その年がうるう年でない場合に true になるかどうかをテストする必要があります。かもしれない。

于 2014-10-16T12:13:13.520 に答える
1

テストケースの観点から考えるのが好きです。そのようなメソッドが true または false を返す原因beginDateとなる値は何ですか?endDate

例えば、同い年だったら?おそらく、両方の値が 2 月 29 日の同じ側にあるか、2 月 29 日にまたがっています。

彼らが別の年にいる場合はどうなりますか?それらの年が隣接している場合、またはその間に他の年がある場合はどうなりますか? おそらく、その間の年はうるう年でさえありません。

この種のシナリオでできることは、これらのケースの例をまとめてメソッドを記述し、すべてのアサートがパスするまでメソッドを調整することです。

以下は、あなたが取ることができるアプローチです。beginDateおよび/またはmaturityうるう日に着陸するケースを追加することができます。

public class Q26403911 {
    @Test
    public void testContainsLeapYear() throws Exception {
        Assert.assertTrue(isContainsLeapYear(LocalDate.of(1984, 2, 28), LocalDate.of(1984, 3, 1)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1985, 2, 28), LocalDate.of(1985, 3, 1)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 2, 27), LocalDate.of(1984, 2, 28)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 3, 1), LocalDate.of(1984, 3, 2)));
        Assert.assertTrue(isContainsLeapYear(LocalDate.of(1984, 2, 28), LocalDate.of(1985, 3, 1)));
        Assert.assertTrue(isContainsLeapYear(LocalDate.of(1983, 3, 1), LocalDate.of(1984, 3, 1)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1984, 3, 1), LocalDate.of(1985, 3, 1)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1983, 2, 28), LocalDate.of(1984, 2, 28)));
        Assert.assertTrue(isContainsLeapYear(LocalDate.of(1983, 3, 1), LocalDate.of(1985, 2, 28)));
        Assert.assertFalse(isContainsLeapYear(LocalDate.of(1985, 3, 1), LocalDate.of(1987, 2, 28)));
    }

    public boolean isContainsLeapYear(LocalDate beginDate, LocalDate maturity) {
        if (beginDate.getYear() == maturity.getYear())
        {
            if (!Year.isLeap(beginDate.getYear()))
            {
                return false;
            }

            if (maturity.isBefore(LocalDate.of(beginDate.getYear(), Month.FEBRUARY, 29)))
            {
                return false;
            }

            if (beginDate.isAfter(LocalDate.of(maturity.getYear(), Month.FEBRUARY, 29)))
            {
                return false;
            }

            return true;
        }
        else if (Year.isLeap(beginDate.getYear())
                        && !beginDate.isAfter(LocalDate.of(beginDate.getYear(), Month.FEBRUARY, 29)))
        {
            return true;
        }
        else if (Year.isLeap(maturity.getYear())
                        && !maturity.isBefore(LocalDate.of(maturity.getYear(), Month.FEBRUARY, 29)))
        {
            return true;
        }
        else
        {
            for (int year = beginDate.getYear() + 1; year < maturity.getYear(); year++)
            {
                if (Year.isLeap(year))
                {
                    return true;
                }
            }
        }
        return false;
    }
}
于 2014-10-16T14:56:27.097 に答える
1

間隔を作成して確認するのはどうですか?何かのようなもの:

    LocalDate beginDate, maturity;
    final Interval interval = new Interval(beginDate.toDateTimeAtStartOfDay(), maturity.toDateTimeAtStartOfDay());
    if (interval.contains(new DateTime(beginDate.getYear(), Month.FEBRUARY, 29, 0, 1)) ||
        interval.contains(new DateTime(maturity.getYear(), Month.FEBRUARY, 29, 0, 1))) {
        // It does
    }
于 2014-10-16T12:20:58.493 に答える