给定一个示例事件重现计划,其定义如下:
StartTime: Monday, 2016-June-06 09:00H EndTime: Monday, 2016-August-29 10:00H Period: Bi-weekly
这意味着,每 2 周的星期一 09:00H,直到 2016 年 8 月 29 日。但是结束时间是在 8 月 29 日星期一,也就是新一周的开始,但应该包含在时间表中(因为它在 10:00H 结束)。所以我预计该事件会发生 7 次。
相反,如果 endTime 是 8 月 29 日的 08:00H,那么我预计该事件只会发生 6 次。
现在,我使用 Joda Time 计算出现次数:
Weeks.weeksBetween(startTime, endTime).dividedBy(乘数).getWeeks()
当然,这只给了我 6 次而不是 7 次,因为持续时间实际上只有 12 周,最后一次出现是在上周之后的星期一(星期日结束)。所以这不算整周。这同样适用于任何其他类型的时间表 - 月、日、年等。
如何可靠地计算两次之间事件的发生次数?
谢谢
最佳答案
使用伪代码,因为我对 Yoda 不太熟悉我是:
- counter = 1,someDate = 开始时间,increment = 两周
- 循环:someDate = someDate + increment
- if someDate < end time: then counter++ else 中断循环
或者,对于不喜欢循环的人:
- 计算开始日期和结束日期之间的确切小时数
- 算出 24 * 7 * 2 适合上述小时数的频率
使用 JodaTime 库的示例代码:
int multiple = 2; //or whatever periodicity is needed
ReadablePeriod jodaPeriod;
switch (mPeriodType){
case DAY:
jodaPeriod = Days.days(multiple);
break;
case WEEK:
jodaPeriod = Weeks.weeks(multiple);
break;
case MONTH:
jodaPeriod = Months.months(multiple);
break;
case YEAR:
jodaPeriod = Years.years(multiple);
break;
default:
jodaPeriod = Months.months(multiple);
}
int count = 0;
LocalDateTime startTime = new LocalDateTime(mPeriodStart.getTime());
while (startTime.toDateTime().getMillis() < mPeriodEnd.getTime()){
++count;
startTime = startTime.plus(jodaPeriod);
}
return count;
关于java - 如何使用 Joda Time 计算事件发生次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39242619/