[Java] 날짜와 시간 표시하기

CastleSilver·2022년 9월 20일

프로젝트에서 regdate를 표시할 때 Timestamp를 이용해서 저장하곤 했는데, 그렇게 사용하는 개발자는 거의 없다는 것을 알게 되어 그 이유가 무엇인지, 날짜와 시간을 저장할 때 가장 좋은 데이터 타입은 무엇인지 궁금해졌다.

Calendar 클래스와 Date 클래스의 문제점

1. 불변객체가 아니다.

Calendar 클래스와 Date 클래스에는 Set 메서드가 존재하여 값을 바꿀 수 있다. 이 때문에 Calendar 객체나 Date 객체가 여러 객체에서 공유되면 한 곳에서 바꾼 값이 다른 곳에 영향을 미치는 부작용이 생길 수 있다.

2. int 상수 필드의 남용

Calendar를 사용한 날짜 연산은 다음과 같이 int 상수 필드를 사용한다.
calendar.add(Calendar.SECOND, 2);

첫 번째 파라미터에 Calendar.JUNE과 같이, 전혀 엉뚱한 상수가 들어가도 이를 컴파일 시점에서 확인할 방법이 없다.

3. 헷갈리는 월 지정

JDK 1.0에서 Date 클래스는 1월을 0으로 표현했기에 10월을 표시하려면 9를 입력해야한다.

4. 일관성 없는 요일 상수

Calendar.get(Calendar.DAY_OF_WEEK) 함수에서 반환한 요일은 int 값으로, 일요일이 1로 표현된다. 그런데 calendar.getTime() 메서드로 Date 객체를 얻어와서 Date.getDay() 메서드로 요일을 구하면 일요일은 0이 된다. 즉, 두 개의 클래스 사이에 요일 지정값에 일관성이 없는 것이다.

5. Date와 Calendar의 불편한 역할 분담

특정 시간대의 날짜를 생성한다거나, 년/월/일 같은 날짜 단위의 계산은 Date 클래스만으로는 수행하기 어렵기 때문에 날짜 연산을 위해서 Calendar 객체를 생성하고, 다시 Calendar 객체에서 Date 객체를 생성한다. 불편함을 덜기 위해 실무에서는 Date의 연산에 Apache commons Lang 라이브러리에 있는 DateUtils 클래스의 plusDays() 메서드나 plusMonth() 메서드 같은 메서드를 주로 활용한다. 그러나 DateUtils 클래스를 쓰더라도 중간 객체로 Calendar를 생성하는 것은 마찬가지다.

6. java.util.Date 하위 클래스의 문제

java.sql.Date 클래스는 상위 클래스인 java.util.Date 클래스와 이름이 같다. 그리고 이 클래스는 Comparable 인터페이스에 대한 정의를 클래스 선언에서 하지 않았기 때문에 Comparable과 관련된 Generics 선언을 복잡하게 만들었다.

java.sql.TimeStamp 클래스는 java.util.Date 클래스에 나노초(nanosecond) 필드를 더한 클래스이다. 이 클래스는 equals() 선언의 대칭성을 어겼다. Date 타입과 TimeStamp 타입을 섞어 쓰면 a.equals(b)가 true라도 b.equals(a)는 false인 경우가 생길 수 있다.

Joda-Time

Joda-Time은 기본 JDK를 대체하는 날짜와 시간 API 중 가장 널리 쓰인다.

특징

  • LocalDate, DateTime 등으로 지역 시간과 시간대가 지정된 시간을 구분했다. LocalDate와 LocalTime으로 날짜와 시간을 별도의 클래스로 구분할 수도 있다.
  • plusDays, plusMinutes, plusSeconds 등 단위별 날짜 연산 메서드를 LocalDate, DateTime 클래스에서 지원한다.
  • 메서드가 호출된 객체의 상태를 바꾸지 않고 새로운 객체를 반환한다. 불변 객체이다.
  • 월의 int 값과 명칭이 일치한다. 1월은 int 값 1이다.
  • 서머타임 기간이면 DateTimeZone.isStandardOffset() 메서드의 반환값이 false이다.
  • 요일 상수는 일관되게 사용한다.
  • 잘못 된 시간대 ID 지정에는 IllegalArguementException을 던진다.

참고 문헌

https://d2.naver.com/helloworld/645609

profile
우당탕탕 비전공자 개발자

0개의 댓글