java - 如何使用 Joda Time 计算事件发生次数?

标签 java jodatime

给定一个示例事件重现计划,其定义如下:

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 不太熟悉我是:

  1. counter = 1,someDate = 开始时间,increment = 两周
  2. 循环:someDate = someDate + increment
  3. if someDate < end time: then counter++ else 中断循环

或者,对于不喜欢循环的人:

  1. 计算开始日期和结束日期之间的确切小时数
  2. 算出 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/

相关文章:

java - 在java中如何添加嵌套 map 对象

java - Joda 部分日期的边界日期

java - 在 Joda 的波兰语言环境中解析日期?

java - 在 Java 中打印持续时间,以便可以按字典顺序排序

java - 无法在@OneToMany 关系spring 数据jpa 中删除

java - 在 Junit 测试中打印出方法的输出

java - 计算闰年

java - java中通过分组列表来统计数量

java - 如何使用 Joda-Time 计算两个日期之间的差异...等

android - Joda Time 不工作