Java

[Java] LocalDateTime

📝 작성 : 2020.06.28  ⏱ 수정 : 
728x90

JDK 8 이전에는 java.util.Date, java.util.Calendar클래스를 대체하기 위해서 Joda-Time 같은 오픈소스 라이브러리를 사용했었다고 합니다.

간단하게 위 두 클래스의 문제점을 알아보고 JDK 8부터 바뀐 Java의 날짜와 시간 API를 알아보겠습니다.

기존 날짜 API의 문제점(Naver D2블로그에서 참고하였습니다. )

  1. 불면 객체가 아님(Not Immutable)
    : set으로 값 변경이 가능
  2. int상수의 남용
    : calendar.add(Calendar.SECOND, 2);
  3. 헷갈리는 월 지정
    : 1월을 0으로 표현, 12월은 11 => 개발자들의 실수 유발
  4. 일관성 없는 요일 상수
    : Calendar 클래스(일요일이 1)와 Date클래스(일요일이 0)간의 요일 지정값에 일관성이 없습니다.
  5. DateCalendar의 역할 분담
  6. 오류에 둔감산 시간대 ID(Asia/Seoul 같은 것들)지정
    : Asia/Seoul을 Seoul/Aisa로 작성해도 오류가 발생하지 않습니다.
  7. java.util.Date하위 클래스의 문제
    : java.sql.Date 클래스와 이름이 같습니다. 또, java.sql.Date클래스는 Comparable 인터페이스에 대한 정의를 클래스 선언하지 않았기 때문에 Comparable과 관련된 제네릭 선언이 복잡합니다.
    : java.sql.TimeStampjava.util.Date에 나노초 필드를 더한 클래스인데 이 클래스는 equals() 선언의 대칭성을 어겼습니다. 그래서 Date 타입과 TImeStamp타입을 섞어서 쓰게되면 a.equals(b)가 true여도 b.equals(a)는 false인 경우가 생길 수 있습니다.

이와 같은 문제점들을 보안하여 JDK 8에서는 JSR-310(Java 8 Date and Time API)의 표준명세로 새로운 API가 추가되었습니다.

JDK 8에서 새롭게 추가된 LocalDate, LocalTime, LocalDateTime에 대해 간단히 알아보겠습니다.

LocalDate

 LocalDate today = LocalDate.now();
 LocalDate myBirth = LocalDate.of(1992, 8, 17);

 System.out.println(today);
 System.out.println(today.getYear());       // 년도
 System.out.println(today.getMonth());      // 월(영어)
 System.out.println(today.getMonthValue()); // 월(숫자)
 System.out.println(today.getDayOfYear());  // 년의 몇번째 일
 System.out.println(today.getDayOfMonth()); // 월의 몇번째 일
 System.out.println(today.getDayOfWeek());  // 요일
 System.out.println(today.isLeapYear());    // 윤년여부

결과

2020-06-29  // today
2020        // today.getYear()
JUNE        // today.getMonth()
6           // today.getMonthValue()
181         // today.getDayOfYear()
29          // today.getDayOfMonth()
MONDAY      // today.getDayOfWeek()
true        // today.isLeapYear()

LocalTime

LocalTime currentTime = LocalTime.now();
LocalTime time = LocalTime.of(10, 59, 20, 111);

System.out.println(currentTime);  
System.out.println(time);
System.out.println(time.getHour());      // 시간
System.out.println(time.getMinute());    // 분
System.out.println(time.getSecond());    // 초
System.out.println(time.getNano());      // 나노 초

결과

00:41:26.136231
10:59:20.000000111
10
59
20
111

LocalDateTime

LocalDateTime now = LocalDateTime.now();
LocalDateTime target = LocalDateTime.of(1992, 8, 17, 4, 20, 18, 4771);

System.out.println(now);
System.out.println(target);

결과

2020-06-29T00:46:07.994615
1992-08-17T04:20:18.000004771

LocalDateTime은 LocalDate의 getYear(), getMonth() 등의 메서드와 LocalTime의 getHour(), getMinute()등의 메서드를 모두 사용할 수 있습니다.

다음에는 LocalDateTime, LocalDate, LocalTime을 각각 String, Date, Timestamp 등으로 형변환 하는 법을 알아보겠습니다.

반응형