2013-07-04 3 views
0

У меня есть требование получить количество дней, прошедших с момента создания. Это число должно быть за минусом выходных. У меня есть только некоторые функции: JulianDay, JulianWeek, JulianYear, чтобы получить значения даты в Julian, у меня также есть Today, который возвращает дату сегодняшнего дня, метку времени, которая возвращает дату и время. Мне удалось получить значение сегодняшней даты создания, используя: JulianDay (сегодня) -JulianDay (дата создания), но я все еще не могу обернуть голову вокруг вычитания выходных днейРасчет количества дней минус выходные

+1

С какой структурой/языком вы работаете? Это может оказаться неактуальным, но это может помочь другим указать API-интерфейсы дат, которые уже существуют и могут помочь вам в этом отношении. – Jasarien

+0

Причина, по которой я не утверждал, потому что я работаю над вычисленным полем на Siebel, но я также подумал, что такой алгоритм будет полезен – eddy

+0

О, теперь я понимаю. Ответ Mi был основан на том, что вы используете java. Вам нужно в течение всего дня прокручивать и спрашивать, текущая дата - воскресенье или суббота, если да, то увеличивайте счетчик. –

ответ

0

Этот код должен делать то, что вы хотите:

Date fromDate = new Date(System.currentTimeMillis()-(30L*24*60*60*1000)); // 30 days ago 
Date toDate = new Date(System.currentTimeMillis()); // now 
Calendar cal = Calendar.getInstance(); 
cal.setTime(fromDate); 
int countDays = 0; 
while (toDate.compareTo(cal.getTime()) > 0) { 
    if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) 
     countDays++; 
    cal.add(Calendar.DATE, 1);  
} 
System.out.println(countDays); 
+0

Спасибо за ответ, но вещь с этим, Siebel заключается в том, что он настолько ограничен тем, что я могу делать там, где нужна эта функция, поэтому у меня нет роскоши такие функции. Доступны только перечисленные функции. – eddy

2

Не совсем уверен, что функции, которые вы цитируемые в вашем вопросе, тем не менее, вы, кажется, комфортно делает основную дату арифметику, чтобы определить количество дней между двумя указанными датами. Жесткая часть кажется , чтобы выяснить, как могут дни вычитать за выходные.

Я думаю, что вы можете сделать это с двумя функциями:

  1. Учитывая две даты, возвращает количество дней между ними. Звоните DAYS(date-1, date-2)
  2. Учитывая дату, верните день недели (где 1 = понедельник ... 7 = воскресенье). Назовите этот DAY-OF-WEEK(date)

Имея эти функции, которые вы можете сделать следующее:

  • Вычислить полные недели в диапазоне дат: WEEKS = DAYS(date-1, date2) mod 7
  • Вычислить дни не части полных недель: DAYS-LEFT = DAYS(date-1, date-2) - (WEEKS * 7)
  • Определение в который день недели приходится последний день: LAST-DAY = DAY-OF-WEEK(date-2)

Регулировка количества DAYS-LEFT от частичной недели следующим образом:

if DAYS-LEFT > 0 then 
    case LAST-DAY 
    when 6 then /* Saturday */ 
     DAYS-LEFT = DAYS-LEFT - 1 
    when 7 then /* Sunday */ 
     if DAYS-LEFT = 1 then 
     DAYS-LEFT = 0 
     else 
     DAYS-LEFT = DAYS-LEFT - 2 
     end-if 
    when other /* Monday through Friday */ 
     case DAYS-LEFT - LAST-DAY 
     when > 1 then 
      DAYS-LEFT = DAYS-LEFT - 2 
     when = 1 then 
      DAYS-LEFT = DAYS-LEFT - 1 
     when other 
      DAYS-LEFT = DAYS-LEFT /* no adjustment */ 
     end-case 
    end-case 
end-if 

DAYS-EXCLUDING-WEEKENDS = DAYS(date-1, date-2) - (WEEKS * 2) + DAYS-LEFT 

Я предполагаю, что вы имеете, или можно построить, а DAYS(date-1, date-2) функцию. Следующий бит - это определить, какой день недели на данную дату. Алгоритм для этого называется Zeller's congruence. Я не буду повторить алгоритм здесь, так как Википедия прекрасно справляется с его описанием.

Надежда это получает вас на вашем пути ...

+0

Это, кажется, хороший алгоритм, но я только что узнал в моем контексте, я не могу использовать% :(столько ограничений! – eddy

1

JulianDay(y,m,d) Ваша функция возвращает серийный номер для каждой даты; скажем, ради обсуждения, что JulianDay(2013,7,4) возвращает 2456478. На следующий день будет 2456479, затем 2456480 и т. д. И, допустим, разница в двух днях равна diff.

Число полных недель в diff, каждый из которых содержит 5 рабочих дней, составляет diff // 7 (это целочисленное деление, поэтому округляет его). Таким образом, если diff составляет 25, будет 25 // 7 = 3 полных недель плюс дополнительные diff % 7 = 4 дней. 3 полные недели содержат 15 рабочих дней; не важно, в какой день недели вы начинаете. Таким образом, вам нужно только рассмотреть 4 дополнительных дня, чтобы посмотреть, как могут быть рабочие дни.

Число, возвращаемое функцией JulianDay, может быть принято по модулю 7 для расчета дня недели; на моей JulianDay функция, по модулю 5 представляет субботу, а по модулю 6 - воскресенье. Вы можете взять 4 дополнительных дня, чтобы быть либо 4 днями в начале периода, либо 4 днями в конце; это не имеет значения, потому что все остальные дни являются частью периода последовательных полных недель, каждый из которых имеет 5 рабочих дней. Скажем, вы выбираете первые 4 дня. Затем возьмите JulianDay первого дня по модулю 7, затем JulianDay первого дня плюс 1 по модулю 7, затем JulianDay первого дня плюс 2 по модулю 7, затем JulianDay первого дня плюс 3 по модулю 7, определите, сколько из них - будние дни, и добавьте это к числу будних дней в полные недели.

Все, что вам нужно, это функция JulianDay.