2015-03-11 3 views
1

У меня есть дата в java, и я хотел бы добавить к ней определенное количество рабочего времени.Как увеличить дату относительно рабочей недели?

Однако, он должен рассмотреть рабочую неделю.

8 Hours days (8:00 to 16:00), 

и

no work on weekends (Saturday/Sunday). 

Так у меня есть Date object давая current time. У меня также есть double, которые являются добавочными для этой даты. Какой был бы лучший способ сделать это?

I'm using Java 8.

Некоторые примеры:

Рабочие в тот же день:

Date date = new Date(2000, 1, 1, 8, 0); //so first of jan, 8:00. Let's assume this is a monday. 
double minutes = 4 * 60; 
Date newDate = addWorkingTime(date, minutes); 
// newDate should be the same day, 12:00 

Работа над несколькими дней:

Date date = new Date(2000, 1, 1, 14, 0); //so first of jan, 14:00. Let's assume this is a monday. 
double minutes = 4 * 60; 
Date newDate = addWorkingTime(date, minutes); 
// newDate should be the next day, 10:00 
// 2 hours on the first day, the next two hours of work on the next. 

Работа в выходные дни:

Date date = new Date(2000, 1, 5, 14, 0); //so fifth of jan, 14:00. Let's assume this is a friday. 
double minutes = 8 * 60; 
Date newDate = addWorkingTime(date, minutes); 
// newDate should be the next monday, 14:00 
// 2 hours on the first day, the next six hours of work the next monday. 

Спасибо!

+0

Можете ли вы привести пример объекта «Дата» и какой результат вы получите для добавления некоторого примера * минут *? –

+0

Конечно, я добавлю его к вопросу. –

+0

Voila, добавил примеры;) Надеюсь, они достаточно ясны. –

ответ

0

Вы можете использовать этот метод:

public static LocalDateTime addWorkingMinutes(LocalDateTime date, long minutes) { 
    if (date.getHour() < 8) { 
     // Working day hasn't started. Reset date to start of this working day 
     date = date.withHour(8).withMinute(0).withSecond(0); 
    } 

    // Take care of weekends 
    if (date.getDayOfWeek() == DayOfWeek.SATURDAY) { 
     date = date.plusDays(2); 
    } else if (date.getDayOfWeek() == DayOfWeek.SUNDAY) { 
     date = date.plusDays(1); 
    } 

    LocalDateTime endOfCurrentWorkingDay = date.withHour(16).withMinute(0).withSecond(0); 

    // Get minutes from date to endOfCurrentWorkingDay 
    long minutesCovered = ChronoUnit.MINUTES.between(date, endOfCurrentWorkingDay); 
    if (minutesCovered > minutes) { 
     // If minutesCovered covers the minutes value passed, that means result is the same working 
     // day. Just add minutes and return 
     return date.plusMinutes(minutes); 
    } else { 
     // Calculate remainingMinutes, and then recursively call this method with next working day 
     long remainingMinutes = minutes - minutesCovered; 
     return addWorkingMinutes(endOfCurrentWorkingDay.plusDays(1).withHour(8), remainingMinutes); 
    } 
} 

испытанных с входом образца, а также некоторые другие входы на моем конце, учитывая выходные.

Примечание: Я использую Java 8 DateTime API, так как вы уже на Java 8, не должно быть никаких оправданий для использования Date.