0

2 月の最後の日ごとに日付を繰り返す必要があります。Joda 時間を使用して、日、週、月などの日付を生成するルールを使用しています。

private static List<DateTime> calculateRecurrentDates(DateTime startDate, String recurrentRule) {
    List<DateTime> dates = new ArrayList<DateTime>();
    TimeStamp startDate = Timestamp.valueOf("2011-02-28 10:10:10");
    String recurrentRule = "RRULE:FREQ=YEARLY;COUNT=6;INTERVAL=1;";
    String leapYearRule = "RRULE:FREQ=YEARLY;COUNT=6;INTERVAL=1;BYMONTHDAY=28,29;BYSETPOS=-1";

    try {
        DateTimeIterable range = DateTimeIteratorFactory.createDateTimeIterable(recurrentRule, startDate, DateTimeZone.UTC, true);
        for (DateTime date : range) {
           dates.add(date);
        }
    } catch (ParseException e) {
        dates = null;
        logger.error(e.getMessage());
    }
    return dates;
}

しかし、私はこれを受け取ります:

2011-02-28T10:10:10.000Z
2012-02-28T10:10:10.000Z
2013-02-28T10:10:10.000Z
2014-02-28T10:10:10.000Z
2015-02-28T10:10:10.000Z
2016-02-28T10:10:10.000Z

うるう年の場合は次のようになります。

2012-02-29T10:10:10.000Z
2012-12-29T10:10:10.000Z
2013-12-29T10:10:10.000Z
2014-12-29T10:10:10.000Z
2015-12-29T10:10:10.000Z
2016-12-29T10:10:10.000Z
2017-12-29T10:10:10.000Z

毎年 2 月の最終日を取得する 1 つのルールを作成するにはどうすればよいですか?

4

4 に答える 4

1

私の解決策は、年の最後の日から 3 月 1 日の前日までを数えることです。したがって、ルールは次のようになります。

"RRULE:FREQ=YEARLY;COUNT=6;INTERVAL=1;BYYEARDAY=-307"
于 2014-04-16T08:19:07.587 に答える
1

月の最終日に確実にイベントが発生するようにしたい場合はBYMONTHDAY=-1( RRULE in RFCを参照)、それが 2 月にのみ発生するようにするには、次のように指定しBYMONTH=2ます。

RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=-1

次に、COUNTプロパティについて言及しているため、UNTILいつRRULE評価するかを指定する を定義することもできます。

RRULE:FREQ=YEARLY;BYMONTH=2;BYMONTHDAY=-1;UNTIL=20200302T070000Z
于 2014-04-18T12:21:27.717 に答える
0

日付のみを操作する場合は、決して DateTimes を使用しないでください。LocalDate が適切なクラスです。

本当に 2 月の最後の日を取得したい場合:

public static List<LocalDate> getLastDaysOfFebruary(LocalDate start, int n) {
    ArrayList<LocalDate> list = new ArrayList<>();
    LocalDate firstMar = start.withMonthOfYear(3).withDayOfMonth(1);
    if(! firstMar.isAfter(start)) firstMar = firstMar.plusYears(1);
    for(int i=0;i<n;i++) {
        list.add(firstMar.minusDays(1));
        firstMar = firstMar.plusYears(1);
    }
    return list;
}
于 2014-04-16T15:00:10.143 に答える
0

3 月 1 日から 1 日を引きます。

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime firstOfMarch = new DateTime( "2014-03-01", timeZone ).withTimeAtStartOfDay();
DateTime lastOfFebruary = firstOfMarch.minusDays( 1 ).withTimeAtStartOfDay();

firstOfMarchオブジェクトで、呼び出してplusYears(1)先に進みます。

于 2014-04-16T06:30:38.260 に答える