2008-09-18 9 views
1

나는 은행 휴무일과 주말이 전체 기간에 계산되어서는 안된다는 것을 고려하지 않고 잘 작동하는 스톱워치를 구현했습니다. 나는 시간 경과를 알 수있는 오픈 소스 라이브러리를 찾고 있었다. 즉, 인스턴트 인스턴트, 인스턴트 인스턴트 및 은행 휴일 (주말은 계산되지 않음)을 전달했다. 나에게 일을 더 쉽게 해주는 유일한 라이브러리는 net.sf.jtemporal이지만 여전히 기능을 확장해야한다. 원하는 기능을 얻을 수있는 유용한 라이브러리가 있다면 누구에게 알려주시겠습니까?Java의 주말과 은행 휴무일을 고려하지 않은 경과 시간

감사합니다.

답변

0

은행 근무 시간 만 계산합니까? 오전 9시 ~ 오후 3시? 아니면 24 시간입니까?

+0

하루 24 시간이며 경과 시간 (1 근무일 기준 24 시간)을 계산합니다. 경과 된 타이머가 있지만 해당 기간 내 주말 및 공휴일 기간을 뺀 기간을 반환하고 싶습니다. –

2

내가 말한대로 there, 아마도 가장 쉽고 쉬운 접근법은 매일 (1 일당 한 행 = 365 행/년)의 시작일/은행 공휴일 등의 근무일 수에 대한 정보를 포함하는 테이블을 만든 다음 적절한 선택으로 count 함수를 사용하십시오.

+0

죄송합니다. 사용하는 언어가 Java임을 지정하는 질문을 편집했습니다. 고마워. –

1

나는 당신이 그 특정한 것을 찾을 수 있을지 의심 스럽다. 그러나 자신 만의 논리를 만드는 것은 쉽습니다. 다음은 몇 가지 의사 코드입니다.

private long CalculateTimeSpan(DateTime BeginDate, DateTime EndDate, ArrayList<DateTime> BankHollidays) 
{ 
    long ticks = 0; 
    while (BeginDate <= EndDate) // iterate until reaching end 
    { 
     if ((BeginDate is holliday?) || (BeginDate is Weekend?)) 
      skip; 
     else 
      ticks += (24*60*60*1000); 

     BeginDate = BeginDate + 1 day; // add one day and iterate 
    } 

    return ticks; 
} 
+0

값을 반복하는 것을 피하기 위해 HashSet을 사용 하겠지만 약간 비효율적 인 것으로 보입니다. 세분화 된 초 단위 일 경우 매일 60x60x24 번 반복해야하기 때문입니다. 그 경우에 대한 다른보다 효율적인 아이디어. 고마워요. –

0

Joda Time을 살펴보십시오. Java에 포함 된 것보다 훨씬 좋은 날짜/시간 API입니다.

+0

고마워요.하지만 이미 해 봤는데, Java의 것보다 낫지 만, 어쨌든 net.sf.jtemporal은 내 목표를 위해 발견되었습니다. usingCompactPeriodStorage.periodIterator (Period period)와 같이, 지정된 기간과 교차하는 저장 영역의 모든 기간에 대해 반복하는 CloseableIterator를 얻을 수 있습니다. –

0

이것이 올바른 해결책이라고 생각합니다.

/** 
* Calculate elapsed time in milliseconds 
* 
* @param startTime 
* @param endTime 
* @return elapsed time in milliseconds 
*/ 

protected long calculateElapsedTimeAux(long startTime, long endTime) { 
    CustomizedGregorianCalendar calStartTime = new CustomizedGregorianCalendar(this.getTimeZone()); 
    CustomizedGregorianCalendar calEndTime = new CustomizedGregorianCalendar(this.getTimeZone()); 
    calStartTime.setTimeInMillis(startTime); 
    calEndTime.setTimeInMillis(endTime); 
    long ticks = 0; 

    while (calStartTime.before(calEndTime)) { // iterate until reaching end 
     ticks = ticks + increaseElapsedTime(calStartTime, calEndTime); 
    } 

    return ticks; 
} 

private long increaseElapsedTime(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime) { 
    long interval; 
    long ticks = 0; 

    interval = HOURS_PER_DAY*MINUTES_PER_HOUR*SECONDS_PER_MIN*MILLISECONDS_PER_SEC; // Interval of one day 

    if (calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis() < interval) { 
     interval = calEndTime.getTimeInMillis() - calStartTime.getTimeInMillis(); 
    } 

    ticks = increaseElapsedTimeAux(calStartTime, calEndTime, interval); 
    calStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval); 

    return ticks; 
} 

protected long increaseElapsedTimeAux(CustomizedGregorianCalendar calStartTime, CustomizedGregorianCalendar calEndTime, long interval) { 
    long ticks = 0; 

    CustomizedGregorianCalendar calNextStartTime = new CustomizedGregorianCalendar(this.getTimeZone()); 
    calNextStartTime.setTimeInMillis(calStartTime.getTimeInMillis() + interval); 

    if ((calStartTime.isWorkingDay(_nonWorkingDays) && calNextStartTime.isWorkingDay(_nonWorkingDays))) { // calStartTime and calNextStartTime are working days 
     ticks = interval; 

    } 
    else { 
     if (calStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a working day and calNextStartTime is a non-working day 
      ticks = (calStartTime.getNextDay().getTimeInMillis() - calStartTime.getTimeInMillis()); 
     } 
     else { 
      if (calNextStartTime.isWorkingDay(_nonWorkingDays)) { // calStartTime is a non-working day and calNextStartTime is a working day 
       ticks = (calNextStartTime.getTimeInMillis() - calStartTime.getNextDay().getTimeInMillis()); 
      } 
      else {} // calStartTime and calEndTime are non-working days 
     } 
    } 

    return ticks; 
}