2010-05-01 3 views
6

Я бы хотел рассчитать дата окончания (и время) события. Я знаю дата начала и продолжительность (в минутах). Но:Расчет даты окончания при пропуске праздников + время в Joda

  1. Я должен пропустить отпуск - единовременная ситуации
  2. я должен пропустить выходные - рецидивирующий ситуацию
  3. я должен не счетчика рабочего времени (например: с 8:00 утра до 5 : 00pm) - повторяющаяся ситуация, но с более тонкой детализацией

Есть ли простой способ достичь этих случаев с использованием библиотеки времени Joda?

ответ

2

Jodatime поможет вам, я бы сказал, но вам нужно написать логику самостоятельно, цикл, пропущенный несколько дней и несколько раз дня. Мне кажется, не очень просто, ни очень сложно.

+0

Маркировка как принятый ответ, потому что это правда. По моим исследованиям, простого решения нет. И Jodatime определенно полезен. – picca

1

Сначала вы должны определить «праздники». Не у каждого региона есть те же самые, поэтому это должно быть сделано общим и подключаемым.

Я не думаю, что это «просто».

+0

В моем случае праздники хранятся в базе данных. Но я хотел указать, что я не могу использовать: if (dayofweek() == 7) {skip(); } – picca

1

Вы изучали проект Holiday calculation? он показан в Связанных проектах из jodatime и может быть полезен

+0

Выглядит очень хорошо. Но я до сих пор не знаю, как обрабатывать часы работы. Я в основном нуждаюсь в быстрой перемотке данной даты на N-минуты. Пропуск часов работы, праздников и т. Д. – picca

0

Вот код, который я использую. dtDateTimes может содержать предопределенные даты отпуска (например, UK Bank Holidays) и 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; 
} 
Смежные вопросы