计算事件的下一个日期

时间:2019-12-04 09:41:02

标签: java date events date-manipulation

我正在尝试使用重复事件构建应用程序。 在我的数据库中,我有一个表recurring_pattern:

type_name  sepereation_count  day_of_week  week_of_month  day_of_month  month_of_year
daily      0                  NULL         NULL           NULL          NULL
weekly     0                  2            NULL           NULL          NULL
monthly    0                  1            3              NULL          NULL
monthly2   1                  NULL         NULL           10            NULL
yearly     0                  NULL         NULL           20            5

seperation_count:如果需要每隔一周,每月/每周等配置一个事件,则seperation_count将为1
day_of_week:1 =星期一; 2 =星期二等。

我有一个表recurring_events:

id  start_date  last_occurence  recurring_pattern_name
1   2019-10-01  2019-12-03      daily
2   2019-10-01  2019-12-03      weekly
3   2019-10-01  2019-11-18      monthly
4   2019-11-01  NULL            monthly2
5   2019-01-01  2019-05-20      yearly

事件的下一个日期应该是:
1 = 2019-12-04因为每一天
2 = 2019-12-10,因为每周二的每个星期(一周从星期一开始)
3 = 2019-12-16,因为星期一每3周
4 = 2019-12-10,因为第二个月的10号。
5 = 2020-05-20,因为每年,第5个月和第20天

现在,我正在尝试在Java中查找下一个日期,但我不知道该怎么做。
对于日常活动,我有

nextDate = lastPaid == null ? startDate : lastPaid;
nextDate = nextDate.plusDays(1 + recurringPattern.getSepereationCount());

但是我如何获得每周,每月,每月2和每年的活动的下一个日期?

I used this as a template

1 个答案:

答案 0 :(得分:0)

每周计划

    int separationCount = 0;
    LocalDate start = LocalDate.parse("2019-10-01");
    int dowNumber = 2;

    DayOfWeek dow = DayOfWeek.of(dowNumber);

    LocalDate first = start.with(TemporalAdjusters.nextOrSame(dow));
    System.out.println("first: " + first);
    LocalDate next = first.plusWeeks(1 + separationCount);
    System.out.println("next: " + next);

此演示代码段的输出为:

first: 2019-10-01
next: 2019-10-08

每月计划

    LocalDate start = LocalDate.parse("2019-10-01");
    int dowNumber = 1;
    int weekOfMonth = 3;

    DayOfWeek dow = DayOfWeek.of(dowNumber);

    LocalDate first = start.with(WeekFields.ISO.weekOfMonth(), weekOfMonth)
            .with(dow);
    if (first.isBefore(start)) {
        // Use next month instead
        first = start.plusMonths(1)
                .with(WeekFields.ISO.weekOfMonth(), weekOfMonth)
                .with(dow);
    }

    System.out.println("first: " + first);
first: 2019-10-14

您可以用类似的方式计算以下日期。

Monthly2计划

这很简单。使用LocalDate.withDayOfMonth()LocalDate.plusMonths()。切记以与上述相同的方式检查您计算的第一个日期是否在开始日期之前。请记住,第29、30或31天不会每个月正常工作。

年度计划

我把这个留给你。在LocalDate的文档中找到所需的内容。

文档链接