
날짜와 시간은 거의 모든 애플리케이션에서 필요한 요소입니다.
예약 시스템, 로그 기록, 만료 시간 계산 등 다양한 기능에 관여하죠.
자바(Java)에서는 오래전부터 Date, Calendar 클래스를 제공했지만, 불편함과 문제점 때문에 자바 8 이후에는 java.time 패키지 기반의 새로운 API가 표준처럼 사용되고 있습니다.
이번 글에서는 자바에서 날짜 및 시간을 다루는 다양한 방법과 그 차이점을 살펴보겠습니다.
1. 자바에서 날짜와 시간이 중요한 이유
- 시간 기반 이벤트 처리 (예: 알림, 스케줄러)
- 데이터의 유효성 판단 (예: 만료일)
- 로그 및 트랜잭션 기록
- 글로벌 시간대 처리 (서버 vs 클라이언트 간 시간 동기화)
정확하고 일관된 시간 처리는 기능의 안정성과 신뢰도에 큰 영향을 줍니다.
2. Date 클래스는 왜 권장되지 않을까?
java.util.Date는 자바 초창기부터 제공된 클래스이지만, 다음과 같은 문제점이 존재합니다:
- 월(month)은 0부터 시작 (1월 = 0)
- 연도(year)는 1900년 기준 오프셋
- 불변(immutable)이 아니어서 스레드 안전하지 않음
- 시간대 정보 부족
Date date = new Date();
System.out.println(date); // 시스템 현재 시간 출력
직관성이 떨어지고 유지보수가 어려워 현재는 거의 사용되지 않습니다.
3. Calendar 클래스의 구조와 한계
Calendar는 Date보다 개선된 기능을 제공하지만, 여전히 복잡한 구조와 낮은 가독성 문제로 잘 쓰이지 않습니다.
Calendar cal = Calendar.getInstance();
cal.set(2025, Calendar.JULY, 3);
System.out.println(cal.getTime());
- 월(month)이 여전히 0부터 시작
- 객체가 불변이 아님
- 날짜 연산이 복잡하고 직관적이지 않음
이러한 문제들로 인해 자바 8에서는 새로운 날짜/시간 API가 등장했습니다.
4. LocalDate, LocalTime, LocalDateTime의 등장
자바 8 이후 등장한 java.time 패키지는 불변성, 명확한 타입 분리, 강력한 유틸리티 메서드를 제공합니다.
LocalDate date = LocalDate.now(); // 오늘 날짜
LocalTime time = LocalTime.now(); // 현재 시간
LocalDateTime dateTime = LocalDateTime.now(); // 날짜 + 시간
- LocalDate: 날짜만 (년/월/일)
- LocalTime: 시간만 (시/분/초)
- LocalDateTime: 둘 다 포함
시간대가 필요한 경우는 ZonedDateTime 또는 OffsetDateTime을 사용합니다.
5. 날짜 연산과 포맷 처리 방법 정리
날짜 연산
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1);
LocalDate lastMonth = today.minusMonths(1);
- .plusDays(), .minusYears() 등 다양한 메서드 제공
- 기존 객체는 유지되고, 새로운 객체 반환 → 불변성 보장
날짜 포맷
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
String formatted = LocalDateTime.now().format(formatter);
- 사용자 정의 형식 지정 가능
- 다양한 Locale 및 시간대도 적용 가능
✅ 마무리
자바에서 날짜 및 시간 처리는 단순히 현재 시간을 구하는 것 이상의 의미를 가집니다.
오래된 Date와 Calendar는 하위 호환용으로 남겨두고, 앞으로는 LocalDate, LocalDateTime, ZonedDateTime 등의 최신 API를 사용하는 것이 표준입니다.
불변성, 직관적 메서드, 포맷 처리의 편리함 덕분에 코드의 안정성과 생산성이 모두 향상됩니다.