2013-11-09 6 views
1

У меня две даты, наем 11/19/2013 и завершение 10/01/2014, оба конвертируются в общее количество часов, не учитывая выходные дни, но у них разные годы, и из-за этого в отчете говорится: общее количество отработанных часов был -1200:Как рассчитать общий час работы между двумя датами?

private int calculateTimeInternship(Vacancy peoplevacancy){ 
    int hourWorked = 0; 
    Calendar date1 = Calendar.getInstance(); 
    Calendar date2 = Calendar.getInstance();  

    date1.setTime(peoplevacancy.getDthiring()); 
    date2.setTime(peoplevacancy.getDtendhiring()); 

    int initiation = date1.get(Calendar.DAY_OF_YEAR); 
    int end = date2.get(Calendar.DAY_OF_YEAR); 

    int amountDay = (initiation - end) + 1; 

    for (; initiation <= end; inicio++){ 
     if (date1.get(Calendar.DAY_OF_WEEK) == 1 || date1.get(Calendar.DAY_OF_WEEK) == 7) 
     amountDay--; 

     date1.add(Calendar.DATE, 1); 
    } 

    hourWorked = amountDay * 4 //4 hour per day; 
    return hourWorked ; 
} 

ответ

1

Joda может помочь вам, но я никогда не сможет использовать его из-за своей лицензии.

Если, как я, Joda не подходит для вас, вы можете решить эту проблему следующим образом:

initialize endDate object 
initialize startDate object 
initialize weeksBetween as 
    milliseconds between end&start/milliseconds per day, divided by seven (integer floor). 
    //may need to normalize dates and set them to be both midnight or noon or some common time 
initialize daysBetween = weeksBetween*5 // in any continuous 7 days, 5 are weekdays. 
initialize curDay=startDate + weeksBetween*7 days 

while(curDay is not endDate) 
    add a day to curDay 
    if(curDay is not weekend) 
     daysBetween++ 
output daysBetween* 4 

Вы можете получить миллисекунды между ними путем преобразования календарей Date (Календарь имеет такой метод для сделайте это)

0

Почему так сложно?

private int calculateTimeInternship(Vacancy vacancy) { 
    return 4 * ((int)(vacancy.getDtendhiring().getTime()/86400000L - vacancy.getDthiring().getTime()/86400000L) + 1); 
} 

Разделив на 86400000первого, вычитая, это не имеет значения, в какое время суток каждая дата имеет.

FYI 86400000 - это количество миллисекунд в день.

+0

Игнорирование выходных - это то, что делает его сложным. И я бы не поставил этот коэффициент 1/4 в расчет. – Lan

+0

@John 1/4 - это то, что завершает расчет - количество часов работы в день равно 4, поэтому моя математика правильная, не так ли? И я взял «без учета выходных», чтобы означать, что выходные дни считаются нормальными рабочими днями. – Bohemian

+0

Я имею в виду прямое разделение на миллисекунду в день. Держите 4 * снаружи для ясности и, возможно, напишите 86400000L как 86400_000L (я нахожу, что он дает более четкое представление о том, что это миллисекунды в день, а 000 - это видимый знак отсутствия 0). Это по-прежнему правильно и все, но легче сделать ошибку, имея длинную строку 0 и выполнять математические операции самостоятельно. Другая проблема заключается в том, что это не 4 * количество дней, это 4 * число будних дней, которые я считаю. – Lan

0

Вы уже проходите через каждый день стажировки, так почему бы просто не пересчитать рабочие дни?

int amountDay = 0; 
while (date1.compareTo(date2) <= 0) { 
    if (date1.get(Calendar.DAY_OF_WEEK) != 1 
    && date1.get(Calendar.DAY_OF_WEEK) != 7) 
     amountDay++; 
    date1.add(Calendar.DATE, 1); 
} 

Кстати, ваш исходный код имеет тонкую ошибку «от одного». Вычитание для общего количества дней исключает конечный день, но цикл включает в конце дня при вычете выходных дней.

Смежные вопросы