在跳过假期+ Joda时间的同时计算结束日期

时间:2010-05-01 19:27:30

标签: java jodatime

我想计算一个事件的结束日期(和时间)。我知道开始日期持续时间(以分钟为单位)。但是:

  1. 我必须跳过假期 - 非经常性情况
  2. 我必须跳过周末 - 经常性情况
  3. 我必须计算工作时间(例如:从早上8点到下午5点) - 经常性情况,但具有更细的粒度
  4. 使用Joda时间库是否有简单的方法来实现这些情况?

4 个答案:

答案 0 :(得分:2)

Jodatime会帮助你 - 我会说很多 - 但你需要自己编写逻辑,循环跳过一整天和一天中的某些时间。在我看来,不是很简单,也不是很复杂。

答案 1 :(得分:1)

首先,您必须定义“假期”。并非每个语言环境都具有相同的语言环境,因此必须将其设置为通用且可插入。

我认为这不是“简单”。

答案 2 :(得分:1)

你有没有看过Holiday calculation项目?它在jodatime的相关项目中有特色,可能很有用

答案 3 :(得分:0)

这是我使用的一些代码。 dtDateTimes可以包含您预先定义的假日日期(例如英国银行假日),dtConstants可以包含您想要匹配的重复日期,例如DateTimeConstants.SATURDAY

/**
 * Returns a tick for each of
 * the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code>
 * occurring in the period as represented by begin -> end.
 * 
 * @param begin
 * @param end
 * @param dtConstants
 * @param dtDateTimes
 * @return
 */
public int numberOfOccurrencesInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) {
    int counter = 0;
    for (DateTime current = begin; current.isBefore(end); current = current.plusDays(1)) {
        for (Integer constant : dtConstants) {
            if (current.dayOfWeek().get() == constant.intValue()) {
                counter++;
            }
        }
        for (DateTime dt : dtDateTimes) {
            if (current.getDayOfWeek() == (dt.getDayOfWeek())) {
                counter++;
            }
        }

    }
    return counter;
}

/**
 * Returns true if the period as represented by begin -> end contains any one of
 * the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code>
 *  
 * @param begin
 * @param end
 * @param dtConstants
 * @param dtDateTimes
 */
public boolean isInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) {
    return numberOfOccurrencesInPeriod(begin, end, dtConstants, dtDateTimes) > 0;
}