빨간색코딩

time 패키지 (util.Date와 util.Calendar의 문제, LocalDate, LocalDateTime, DateTimeFormatter) 본문

Java

time 패키지 (util.Date와 util.Calendar의 문제, LocalDate, LocalDateTime, DateTimeFormatter)

빨간색소년 2018. 2. 25. 22:33

참조문서

jdk 1.8 부터 날짜 API 가 좋아졌다고 한다. java.util.Date 와 Calendar 를 사용했을 때도 크게 불편한 건 못느꼈지만(불편했다고하면 0부터 시작한다는거?ㅋㅋ) 새로운 java.time 패키지를 알아보자.

1. 이전 방식의 문제들(util.Date, util.Calendar)

찾아보니까 문제가 많군..?

  1. 복잡한 날짜 계산 : 그레고리력에서 율리우스력을 적용하며 발생한 오차날짜 생략, 서머타임 등등 뭐 이벤트 터지면 시간대가 비는 등등..
  2. 독특한 시간관리 : 시간대 데이터베이스에서 관리, OS와 별도
  3. 불변 객체가 아님
  4. 상수필드 남용
  5. 1월이 0부터 시작함
  6. 일관성 없는 요일 상수
    • Calendar.get(Calendar.DAYOFWEEK) : 일요일은 1
    • Date.getDay() : 일요일은 0
  7. 날짜 생성은 Date 객체, 날짜 연산은 Canlender 객체, 최종 결과는 다시 Date객체

이를 해결하기 위한 노력들

  • joda-time 같은 라이브러리 들이 등장
  • jdk 1.8 부터는 새로운 time 패키지로 해결

2. java.time 패키지

하루를 86400초만 계산한다. 공식시간만을 사용한다. 아래는 대표적인 클래스와 메소드들이다.

  • Instant : 1970년 1월 1일부터 시간을 nanosecond 단위로 센다.
  • LocalDate : 년월일까지 표현
  • LocalDateTime : 년월일시분초 까지 표현
  • LocalTime : 시분초만 표현
  • Period : 두 날짜 사이의 년월일로 표현되는 기간 (LocalDate 사용)
  • Duration : 두 시간 사이에 일시분초로 표현되는 기간 (Instant 사용)
  • ChronoUnit : 한가지의 단위를 표현하기 위한 클래스 (년, 월, 일, 시, 분, 초 등)
  • DayOfWeek : 요일
  • ZonedDateTime : 구역에 해당하는 년, 월, 일, 시, 분, 초, 나노초 표현

공통적으로 많이 쓰는 메소드들

  • now() : 지금을 클래스에 맞게 반환
  • of(파라미터들) : 이 날짜를 클래스에 맞게 반환
  • plus, minus : 해당 클래스에 맞게 날짜 증감
    • ex. LocalDate.now().plusDays(1) : 내일 날짜
  • format(formatter) : formatter를 사용하여이 날짜의 형식을 지정, 변환
  • parse(String, formatter) : 문자열을 formatter 형식으로 변환한다. formatter를 안쓰면 기본형식으로 변환

3. java.time.format 패키지

time의 포맷변환 등으로 많이 쓰인다. java.time 패키지의 클래스들을 지원한다. 미리 정의된 Formatter 를 사용할 수도 있고, locale 종속 Formatter, 커스텀 Formatter 등을 사용할 수 있다.

  • DateTimeFormatter

변환 예제

  • LocalDate -> String : LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
  • LocalDateTime -> String : LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.KOREA));
  • String -> LocalDate : LocalDate.parse("2018-02-21");
  • String -> LocalDateTime : LocalDateTime.parse("2018-02-21 16:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));


Comments