본문 바로가기
카테고리 없음

자바 날짜 시간 처리 기본 가이드

by 기록하는 거부기 2025. 7. 14.

날짜와 시간은 거의 모든 애플리케이션에서 필요한 요소입니다.
예약 시스템, 로그 기록, 만료 시간 계산 등 다양한 기능에 관여하죠.
자바(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 클래스의 구조와 한계

CalendarDate보다 개선된 기능을 제공하지만, 여전히 복잡한 구조와 낮은 가독성 문제로 잘 쓰이지 않습니다.

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 및 시간대도 적용 가능

✅ 마무리

자바에서 날짜 및 시간 처리는 단순히 현재 시간을 구하는 것 이상의 의미를 가집니다.
오래된 DateCalendar는 하위 호환용으로 남겨두고, 앞으로는 LocalDate, LocalDateTime, ZonedDateTime 등의 최신 API를 사용하는 것이 표준입니다.
불변성, 직관적 메서드, 포맷 처리의 편리함 덕분에 코드의 안정성과 생산성이 모두 향상됩니다.