도움이 필요합니다. 두 날짜 간의 업무 시간은 어떻게 계산합니까? 예를 들어 두 개의 날짜가 있습니다. 01/01/2017 10:00 및 04/01/2017 15:00. 평일 오전 9시 30 분에서 오후 5시 30 분 (8 시간) 근무하고 있습니다. Java로 근무 시간과 분을 어떻게 계산합니까?Java의 주말을 제외한 두 날짜 간의 근무 시간 만 계산하십시오.
도움 주셔서 감사합니다.
도움이 필요합니다. 두 날짜 간의 업무 시간은 어떻게 계산합니까? 예를 들어 두 개의 날짜가 있습니다. 01/01/2017 10:00 및 04/01/2017 15:00. 평일 오전 9시 30 분에서 오후 5시 30 분 (8 시간) 근무하고 있습니다. Java로 근무 시간과 분을 어떻게 계산합니까?Java의 주말을 제외한 두 날짜 간의 근무 시간 만 계산하십시오.
도움 주셔서 감사합니다.
내 머리 꼭대기에서 벗어납니다.
java.time
패키지를 현대적인 Java 날짜 및 시간 패키지 인 서브 패키지로 공부하는 것이 좋습니다. an Oracle tutorial뿐만 아니라 그물에 다른 좋은 읽을 거리 자료가 있습니다.
다음으로 모델 (도메인, 비즈니스 계층)과 (사용자) 인터페이스를 구분합니다. 나는 01/01/2017 10:00
이 어딘가의 입력 문자열이라고 가정하고 있습니다. 나는 이것을 인터페이스로 간주 할 것이다. 모델에서는 데이터에 datetime 클래스와 객체를 사용하려고합니다.
표준 시간대와 서머 타임 (DST)을 고려해야하는지 생각해보십시오. 여름철 과도기는 보통 밤에는 일어나고 근무 시간에는 일어나지 않으므로 생각하지는 않지만 직접 결정하십시오. 만약 당신이 이것을 필요로한다면, ZonedDateTime
개체를 의지하십시오. 그렇지 않으면 LocalDateTime
입니다.
나는 근무 시간 계산을위한 좋은 단위 테스트를 작성하는 것으로 시작할 것입니다. 입력 문자열을 LocalDateTime
또는 ZonedDateTime
으로 변환하기 위해 하나를 쓰고 싶지만 여기서는 많은 테스트를하지 않아도됩니다.
LocalDateTime
개체로 두 datetime 값을 구문 분석하는 데 DateTimeFormatter
을 사용합니다. 그런 다음 .atZone()
을 ZonedDateTime
으로 변환해야하는 경우
모델/작업 시간 계산
나는 그들이 외부의 근무 시간을 넘어 경우 시작과 끝 날짜를 조정하는 것이 편리 할 것이라고 생각하고 this question에서 영감을. 예를 들어 시작 시간이 오전 3시에 토요일이면 근무일 시작시 월요일로 이동하십시오. 종료 시간이 토요일 오전 3시라면 작업 일의 마지막 날에 금요일로 이동하십시오. 정확한 방법에 따라getDayOfWeek
,
toLocalDate
,
minusDays
,
plusDays
및
atTime
과 같은 방법이 필요합니다. 이 단계를 건너 뛰어도 좋을지 여부를 나중에 알 수 있습니다. 또는 시간 만 이동하고 날짜는 변경하지 않을 수도 있습니다.
다음으로 ChronoUnit
열거 형이 필요합니다. 예를 들어 ChronoUnit.WEEKS.between(startDateTime, endDateTime)
으로 시작하여 해당 간격에서 전체 주 수를 찾으십시오. 주당 근무 시간 수를 곱하십시오. 매력적인 옵션은 Duration
오브젝트에 시간을 저장하는 것입니다. 이후에 어쨌든 나중에 필요할 것으로 생각하기 때문입니다. 또한 나머지 작업 시간 (일 및 시간) 간격을 갖도록 시작 시간에 주를 추가하십시오.
요일이 근무일인지, 근무일의 끝과 시작 시간인지를 살펴 봐야하기 때문에이 시점에서 점점 더 복잡해지고 있습니다. Duration
클래스는 새로운 시작 날짜/시간에서 종료 날짜/시간까지 각 작업 일의 시간, 분 및 초를 합산하는 데 편리합니다. between
및 plus
방법을 사용할 수 있습니다.새 시작 datetime과 종료 datetime이 같은 날짜에 특별히 나오는 경우를 처리해야 할 수도 있습니다.
이것이 시작되지 않았는지 확인하십시오.
여기에서 시작할 수 있습니다. https://docs.oracle.com/javase/tutorial/datetime/iso/index.html – nandsito
제가 이런 종류의 문제에 대해 읽은 가장 좋은 기술은 날짜 데이터베이스를 유지하는 것입니다. isWeekday','isWeekday','holidays' (가장 가능성이 큰 외래 키),'workingHours' 등 관심있는 모든 속성에 대한 컬럼을 포함하고 있습니다. 그런 다음 워킹 세트를 만드는 것은 비교적 간단합니다 SQL 쿼리에서 레코드를 추출한 다음 Java Java 처리를 수행합니다. –
관련 내용 : [Java에서 근무일 기준 2 일간의 회의록 가져 오기] (https://stackoverflow.com/questions/28995301/get-minutes-between-two-working-days-in-java). 그리고 [주말을 추가하지 않는 것을 고려하여 현재 영업 시간을 추가하는 방법은 무엇입니까? - Java] (https://stackoverflow.com/questions/34943530/how-to-add-business-hours-to-date-considering-not-adding-weekends-java). –