Date, Calendar를 쓰면 안되는 이유

hamonjamon·2023년 3월 22일
0

자바에서 날짜, 시간 등을 표현할 때 Date, Calendar 클래스가 쓰인다.

Date, Calendar 클래스의 경우 자바 1버전에서 출시된 것으로 나온지 아주 오래된 놈이다.
그렇기에 여러 문제점을 갖고 있다.

대표적인 문제점을 집어보겠다.

Date의 클래스 문제점

  • Date 클래스는 내부적으로 mutable한 상태를 가지고 있기 때문에 set메서드를 통해 값이 바뀌어, mutable한 상태가 변경되어서 값이 변경되게 된다.
    이러한 경우에는 다른 곳에서도 같은 인스턴스를 참조하고 있을 경우에도 값이 변경되어 예기치 않은 결과가 발생할 수 있다.

Calander 클래스의 문제점

  • Calendar 클래스는 복잡하고 잘못 사용하면 버그가 발생할 수 있는 상황이 많다.
    그 중에서도 가장 대표적인 예시는 월(month) 정보를 다루는데 있다.
    Calendar 클래스에서 월 정보를 다루는 메서드들은 0부터 시작하며, 0은 1월을 의미하고, 11은 12월을 의미한다.
    이러한 특징 때문에 다음과 같은 코드를 작성할 경우 버그가 발생할 수 있습니다.

그렇기에 우린 자바 8버전에서 출시된 java.time 패키지를 사용하자

  • 자바 8부터는 java.time 패키지를 도입하여 새로운 API를 제공하는데, 이 API는 날짜와 시간 정보를 다루는 작업이 쉽고 간편하며, 불변 객체로 구현되어 있기 때문에 안전하게 사용할 수 있다.

다음의 코드를 통해 현재 날짜 및 이전의 날짜의 정보를 가져올 수 있다.


		ZoneId seoulZoneId = ZoneId.of("Asia/Seoul");
        LocalDateTime now = LocalDateTime.now(seoulZoneId);
        Instant threeDaysAgo = now.minusDays(3).with(LocalTime.MIN).atZone(seoulZoneId).toInstant();
        Instant nowInstant = now.atZone(seoulZoneId).toInstant();

with 메서드의 인자로 LocalTime.MIN, LocalTime.MAX를 넣어 활용하면 해당 날짜의 00:00:00, 23:59:59의 유닉스 타임을 가져올 수 있는데, 아주 유용하다

  • now.with(LocalTime.MIN).atZone(seoulZoneId).toInstant();
  • now.with(LocalTime.MAX).atZone(seoulZoneId).toInstant();

0개의 댓글