홈 › 중급 › 08 / 9

java.time 실무 날짜 계산

정산일, 영업일, 월말, 시간대, DB 매핑
섹션 7진행 0 / 9

5. 자주 하는 실수 (Tip)

❌ 실수 1: 반환값을 버린다

java
date.plusDays(1);            // 아무 일도 안 일어남
date = date.plusDays(1);     // ✅

❌ 실수 2: 월말 정산을 plusMonths 로 이어 간다

1월 31일 → 2월 28일 → 3월 28일. YearMonth.plusMonths().atEndOfMonth() 로 매번 말일을 다시 구합니다.

❌ 실수 3: YYYY, hh, mm/MM 을 섞는다

YYYY-MM-dd 는 12월 마지막 주에 다음 해가 찍힙니다. 포맷 문자열은 복사해 쓰지 말고 yyyy-MM-dd HH:mm:ss 를 상수로 두세요.

❌ 실수 4: LocalDateTime.now() 로 저장한다

서버 시간대에 따라 값이 달라집니다. Instant.now() 로 저장하거나 now(ZoneId) 로 시간대를 명시합니다. 컨테이너에서 TZ=Asia/Seoul 환경변수를 잊으면 UTC 가 됩니다.

❌ 실수 5: 시각만으로 소요 시간을 잰다

Duration.between(LocalTime, LocalTime) 은 자정을 넘기면 음수입니다. Instant 나 System.nanoTime() 으로 잽니다.

❌ 실수 6: 사용자 입력을 SMART 로 파싱한다

2월 31일 이 조용히 2월 28일 로 저장됩니다. 입력 검증은 ResolverStyle.STRICT + uuuu.

❌ 실수 7: 날짜 비교에 equals 를 쓴다

ZonedDateTime.equals 는 시간대가 다르면 같은 순간이어도 false 입니다. 순간 비교는 isEqual, 순서는 isBefore/isAfter. LocalDate 끼리는 equals 가 안전합니다.