计算事件的下一个日期
Calculating next date for events
我正在尝试构建具有重复事件的应用程序。
在我的数据库中,我有一个 table 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:如果需要每隔week/month/etc配置一个事件,那么seperation_count就是1
day_of_week:1 = 星期一; 2 = 星期二等
我有一个 table 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 和每年活动的下一个日期?
每周计划
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
您可以用类似的方式计算以下日期。
包月2方案
这个非常简单。使用 LocalDate.withDayOfMonth()
和 LocalDate.plusMonths()
。请记住以与上述相同的方式检查您计算的第一个日期是否在开始日期之前。请记住,第 29、30 或 31 天并非每个月都适用。
年度计划
我把这个留给你。在 LocalDate
.
的文档中找到您需要的内容
文档链接
我正在尝试构建具有重复事件的应用程序。 在我的数据库中,我有一个 table 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:如果需要每隔week/month/etc配置一个事件,那么seperation_count就是1
day_of_week:1 = 星期一; 2 = 星期二等
我有一个 table 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 和每年活动的下一个日期?
每周计划
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
您可以用类似的方式计算以下日期。
包月2方案
这个非常简单。使用 LocalDate.withDayOfMonth()
和 LocalDate.plusMonths()
。请记住以与上述相同的方式检查您计算的第一个日期是否在开始日期之前。请记住,第 29、30 或 31 天并非每个月都适用。
年度计划
我把这个留给你。在 LocalDate
.