JDK 8 이전에는 java.util.Date
, java.util.Calendar
클래스를 대체하기 위해서 Joda-Time
같은 오픈소스 라이브러리를 사용했었다고 합니다.
간단하게 위 두 클래스의 문제점을 알아보고 JDK 8부터 바뀐 Java의 날짜와 시간 API를 알아보겠습니다.
기존 날짜 API의 문제점(Naver D2블로그에서 참고하였습니다. )
- 불면 객체가 아님(Not Immutable)
: set으로 값 변경이 가능 - int상수의 남용
: calendar.add(Calendar.SECOND, 2); - 헷갈리는 월 지정
: 1월을 0으로 표현, 12월은 11 => 개발자들의 실수 유발 - 일관성 없는 요일 상수
:Calendar
클래스(일요일이 1)와Date
클래스(일요일이 0)간의 요일 지정값에 일관성이 없습니다. Date
와Calendar
의 역할 분담- 오류에 둔감산 시간대 ID(Asia/Seoul 같은 것들)지정
: Asia/Seoul을 Seoul/Aisa로 작성해도 오류가 발생하지 않습니다. java.util.Date
하위 클래스의 문제
:java.sql.Date
클래스와 이름이 같습니다. 또,java.sql.Date
클래스는 Comparable 인터페이스에 대한 정의를 클래스 선언하지 않았기 때문에 Comparable과 관련된 제네릭 선언이 복잡합니다.
:java.sql.TimeStamp
는java.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 등으로 형변환 하는 법을 알아보겠습니다.
반응형
'Java' 카테고리의 다른 글
[Java] 배열을 ArrayList로 변환 (0) | 2020.06.30 |
---|---|
[Java] 자바 날짜, 시간 API의 형변환 방법 (0) | 2020.06.29 |
[Java] 배열을 복사하는 방법 (0) | 2020.06.17 |
[Java] Wrapper class와 Auto Boxing (0) | 2020.06.16 |
[Java] java.util.Date와 java.sql.Date의 차이점 및 변환 (0) | 2020.06.14 |