Summary
- Java8 이전의 날짜 API의 문제점을 알아본다.
- Java8의 새로운 날짜와 시간 라이브러리를 알아본다.
새로운 API를 제공하는 이유
- Java8 이전에 날짜, 시간 관련 기능을 제공하는
- Date와 Calendar는 문제를 가지고 있었다.
Date 클래스 문제점
Date date = new Date();//Wed Apr 22 18:18:50 KST 2020
LocalDate date = LocalDate.now();//2020-04-22
1) Java8의 LocalDate와 비교했을 때, 결과가 직관적이지 않다.
Wed Apr 22 18:18:50 KST 2020
2) Date는 가변클래스이다.
반면에 Java8의 LocalDate는 불변클래스이다.
Calendar 클래스 문제점
Calendar calendar = Calendar.getInstance();
calendar.set(2020, 4 , 22);//2020년 5월 22일
1) Month의 인덱스
Calendar의 Month는 상수필드로써 0부터 시작한다.
즉, 0 -> 1월, 1 -> 2월과 같은 형태이다.
- 다음은 Calendar 클래스에 정의된 상수값이다.
/**
* Value of the {@link #MONTH} field indicating the
* first month of the year in the Gregorian and Julian calendars.
*/
public static final int JANUARY = 0;
/**
* Value of the {@link #MONTH} field indicating the
* second month of the year in the Gregorian and Julian calendars.
*/
public static final int FEBRUARY = 1;
/**
* Value of the {@link #MONTH} field indicating the
* third month of the year in the Gregorian and Julian calendars.
*/
public static final int MARCH = 2;
2) 상수 필드 남용
//현재 시간에서 두 시간을 더한다.(HOUR_OF_DAY)
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, 2);
//엉뚱한 상수가 들어갔지만 위와 결과가 같다.(DECEMBER)
Calendar calendar2 = Calendar.getInstance();
calendar.add(Calendar.DECEMBER, 2);
Calendar의 add(int field, int amount) 메소드는 일정 시간 만큼 +, - 해주는 역할이다.
하지만 첫번째 파라미터에 Calendar.DECEMBER과 같이 엉뚱한 상수가 들어가도
컴파일 시점에 확인 할 수 없을뿐더러, 결과가 같을 수도 있다.
3) Calendar 역시 가변클래스이다.
LocalDate와 LocalTime
- LocalDate는 날짜를 표현하며
- LocalTime은 시간을 표현한다.
- 장점은 크게 두가지라고 생각한다.
불변객체이다.
내장 메서드를 이용해 편리하게 사용할 수 있어 직관적이다.
LocalDate date = LocalDate.of(2020, 5, 22); //2020-05-22
int year = date.getYear(); // 2020
Month month = date.getMonth(); // MAY
int monthValue = date.getMonthValue() //5
int day = date.getDayOfMonth(); // 5
LocalTime time = LocalTime.of(13, 45, 20); //13:45:20
int hour = time.getHour(); // 13
int minute = time.getMinute(); // 45
int second = time.getSecond(); // 20
- 그밖에 참고 :
1.1. LocalDate, 1.2. LocalTime주요 메서드
- 그밖에 참고 :
날짜 변환하기
LocalDateTime
- LocalDate + LocalTime
LocalDateTime dt = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);
LocalDate date = dt.toLocalDate();
LocalTime time = dt.toLocalTime();
날짜의 속성 바꾸기
- withAttribute 메서드로 기존의 LocalDate를 간단하게 바꿀 수 있다.
- 물론 LocalDate는 불변객체이므로
- 기존 객체를 바꾸지 않고
- 바뀐 속성을 포함하는 새로운 객체를 반환한다.
//절대적인 방식
LocalDate date1 = LocalDate.of(2017, 5, 11); // 2017-05-11
LocalDate date2 = date1.withYear(2010); // 2010-05-11
LocalDate date3 = date2.with(ChronoField.MONTH_OF_YEAR, 1); // 2010-01-11
LocalDate date4 = date3.withDayOfMonth(1); // 2010-01-01
//상대적 방식
LocalDate date1 = LocalDate.of(2017, 5, 11); // 2017-05-11
LocalDate date2 = date1.plusWeeks(1); // 2017-05-18
LocalDate date3 = date2.minusYears(3); // 2014-05-18
LocalDate date4 = date3.plus(3, ChronoUnit.MONTHS); // 2014-08-18
- 그밖에 참고 :
특정 시점을 표현하는 날짜 시간 클래스의 공통 메서드