У меня есть требование получить количество дней, прошедших с момента создания. Это число должно быть за минусом выходных. У меня есть только некоторые функции: JulianDay, JulianWeek, JulianYear, чтобы получить значения даты в Julian, у меня также есть Today, который возвращает дату сегодняшнего дня, метку времени, которая возвращает дату и время. Мне удалось получить значение сегодняшней даты создания, используя: JulianDay (сегодня) -JulianDay (дата создания), но я все еще не могу обернуть голову вокруг вычитания выходных днейРасчет количества дней минус выходные
ответ
Этот код должен делать то, что вы хотите:
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);
Спасибо за ответ, но вещь с этим, Siebel заключается в том, что он настолько ограничен тем, что я могу делать там, где нужна эта функция, поэтому у меня нет роскоши такие функции. Доступны только перечисленные функции. – eddy
Не совсем уверен, что функции, которые вы цитируемые в вашем вопросе, тем не менее, вы, кажется, комфортно делает основную дату арифметику, чтобы определить количество дней между двумя указанными датами. Жесткая часть кажется , чтобы выяснить, как могут дни вычитать за выходные.
Я думаю, что вы можете сделать это с двумя функциями:
- Учитывая две даты, возвращает количество дней между ними. Звоните
DAYS(date-1, date-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. Я не буду повторить алгоритм здесь, так как Википедия прекрасно справляется с его описанием.
Надежда это получает вас на вашем пути ...
Это, кажется, хороший алгоритм, но я только что узнал в моем контексте, я не могу использовать% :(столько ограничений! – eddy
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
.
С какой структурой/языком вы работаете? Это может оказаться неактуальным, но это может помочь другим указать API-интерфейсы дат, которые уже существуют и могут помочь вам в этом отношении. – Jasarien
Причина, по которой я не утверждал, потому что я работаю над вычисленным полем на Siebel, но я также подумал, что такой алгоритм будет полезен – eddy
О, теперь я понимаю. Ответ Mi был основан на том, что вы используете java. Вам нужно в течение всего дня прокручивать и спрашивать, текущая дата - воскресенье или суббота, если да, то увеличивайте счетчик. –