Чтобы найти следующий рабочий день - PullRequest
4 голосов
/ 09 февраля 2012

Допустим, я сохранил кучу выходных в моей базе данных.

Что мне нужно сделать, это выяснить, какой следующий рабочий день исключает субботу и праздничные дни, определенные в базе данных.

напр.

Допустим, сегодня пятница, 15 февраля, 17 и 18 выходных, которые определены в базе данных как дата и время.Так что теперь, когда я нажимаю кнопку с надписью на следующий рабочий день, она должна вернуться 19 февраля.

Какой самый эффективный способ получить ее?

Ответы [ 4 ]

10 голосов
/ 09 февраля 2012

Простейшие.

Шаг 1: Получите выходные данные из БД и отформатируйте их в своем формате, сохраните в List<String>

Шаг 2. Создайте метод, который добавляет день.

public static Date addDays(Date d, int days) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(d);
    cal.add(Calendar.DATE, days);
    return cal.getTime();
}

Шаг 3. Создайте метод для поиска праздников.

public boolean isBankHoliday(java.util.Date d) {
    Calendar c = new GregorianCalendar();
    c.setTime(d);
    if((Calendar.SATURDAY == c.get(c.DAY_OF_WEEK)) || (Calendar.SUNDAY == c.get(c.DAY_OF_WEEK)) || bankHolidays.contains(dString)) {
        return (true);
    } else {
        return false;
    }
} 

Шаг 4: Получите дату ввода. Сверьтесь с выходным днем, делайте петли, пока не найдете рабочий день.

while (isBankHoliday(myDate)) {
    myDate = addDays(myDate, 1);
}
3 голосов
/ 09 февраля 2012

Просто для того, чтобы бросить чистое решение SQL в микшер:

DECLARE @InDate DATETIME
SET @InDate = '25/12/2011'

;WITH CTE ([Date]) AS
(   SELECT  DATEADD(DAY, 1, CAST(@InDate AS DATE)) [Date]
    UNION ALL
    SELECT  DATEADD(DAY, 1, [Date])
    FROM    CTE
    WHERE   [Date] IN (SELECT [Date] FROM YourHolidayTable)
    OR      DATENAME(WEEKDAY, [Date]) IN ('Saturday', 'Sunday')
)

SELECT  MAX([Date]) [NextWorkingDay]
FROM    CTE
3 голосов
/ 09 февраля 2012

Вы можете использовать DateCalculator и Joda (необязательно) для достижения этой цели.В приведенном ниже примере праздники сохраняются в наборе и используется moveByBusinessDays -метод.

import java.util.HashSet;

import junit.framework.Assert;

import net.objectlab.kit.datecalc.common.DateCalculator;
import net.objectlab.kit.datecalc.common.DefaultHolidayCalendar;
import net.objectlab.kit.datecalc.common.HolidayHandlerType;
import net.objectlab.kit.datecalc.joda.LocalDateKitCalculatorsFactory;

import org.joda.time.LocalDate;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;

public class NextBusinessDayTest {

    private DateCalculator<LocalDate> dateCalculator;
    private final LocalDate startDate = new LocalDate(2012, 2, 9); // Thursday


    @BeforeSuite
    public void setUp() {
        HashSet<LocalDate> holidays = new HashSet<LocalDate>();
        holidays.add(new LocalDate(2012, 2, 10));  // Friday
        holidays.add(new LocalDate(2012, 2, 14));  // Tuesday

        DefaultHolidayCalendar<LocalDate> holidayCalendar = new DefaultHolidayCalendar<LocalDate>(holidays);

        LocalDateKitCalculatorsFactory.getDefaultInstance().registerHolidays("holidays", holidayCalendar);
        dateCalculator = LocalDateKitCalculatorsFactory.getDefaultInstance().getDateCalculator("holidays", HolidayHandlerType.FORWARD);
    }


    @Test
    public void testNextBusinessDay() {
        dateCalculator.setStartDate(startDate);
        Assert.assertEquals(dateCalculator.moveByBusinessDays(1).getCurrentBusinessDate(),
        new LocalDate(2012, 2, 13)); // skips the 10th (holiday), 11th and 12th (weekend)

        dateCalculator.setStartDate(startDate);
        Assert.assertEquals(dateCalculator.moveByBusinessDays(2).getCurrentBusinessDate(),
        new LocalDate(2012, 2, 15)); // also skips the 14th (holiday)
    }
}

РЕДАКТИРОВАТЬ:

  1. Существует альтернативная версия библиотеки калькулятора дат, для которой не требуется Joda.
  2. Проверьте, предоставляет ли библиотека другие функции, которые будут полезны в вашем приложении.Если поиск следующего рабочего дня является единственным вариантом использования, лучше всего написать сам метод.Ванати очень хорошо описал базовый подход.
0 голосов
/ 09 февраля 2012

Я не знаю, есть ли у вас встроенные функции в Java, которые могут это сделать, но если вы этого не сделаете:

От макушки головы -

Возможно, проще всего будетхранить в какие дни выходные и праздничные дни?Или, если у вас есть контрольная точка (скажем, 1 января 2012 года), вы можете сохранить день недели и использовать арифметику mod 7 при вычислении нового значения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...