본문 바로가기

프로그래밍/Java

java8 - time

java.time

등장배경

기존에 JDK 1.0 부터 날짜에 대한 처리를 할 수 있는 Date클래스와 Calendar가 가지고 있는 문제점(불변객체가 아니라 수정될 수 있고 윤초를 고려하지 않은점, 1월 ~12월을 0 ~11로 표현)을 해소하기 위해 java 8 부터는 java.time 패키지가 추가되었다.
java.time 패키지는 아래와 같은 4개의 하위 패키지를 가지고 있다.

패키지 -
java.time.chrono 표준(ISO-8601)이 아닌 달력 시스템을 사용할떄 필요한 클래스 제공
java.time.format 날짜와 시간을 파싱하고 형식화하는데 사용되는 클래스 제공
java.time.temporal 날짜와 시간에 대한 연산에 사용되는 클래스 제공
java.time.zone 타임존과 관련된 클래스 제공

위의 패키지에 속한 클래스의 인스턴스는 불변객체여서 항상 새로운 객체를 생성하여 반환한다.

java.time패키지의 핵심 클래스

java.time패키지는 날짜와 시간을 별도의 클래스로 분리하였다.
LocalDate클래스는 날짜를 표현할떄 사용, LocalTime는 시간을 표현할때 사용, LocalDateTime는 날짜와 시간이 모두 필요할 때 사용한다.

객체 생성하기

세 클래스는 객체를 생성하기위해 now(),of()메서드를 제공한다.
now(): 현재날짜와 시간으로 객체를 생성
of(): 특정날짜와 시간을 인자로 입력받아 객체를 생성

LocalDate today = LocalDate.now();
LocalTime present = LocalTime.now();
System.out.println(today + " " + present);  //2020-02-11 08:52:49.044916

LocalDate birthDay = LocalDate.of(1992, 06, 06);
LocalTime birthTime = LocalTime.of(02, 02, 00, 100000000);
System.out.println(birthDay + " " + birthTime); //1992-06-06 02:02:00.100

LocalDateTime currentDateTime = LocalDateTime.now();
LocalDateTime birthDateTime = LocalDateTime.of(1992,06,06,02,24,10,100000000);
System.out.println("birthDateTime = " + birthDateTime);//birthDateTime = 1992-06-06T02:24:10.100

값 가져오기

LocalDate와 LocalTime클래스의 특정 필드의 값을 가져오기 위해 다양한 getter메서드를 제공한다.

LocalDate ex)1999-12-31

메서드 설명
int getYear() 년도 반환(1999)
int getMonthValue() 월 반환(12)
Month getMonth() 월의 필드값을 반환 (12) - December
int getDayOfMonth() 일 반환(31)
int getDayOfYear() 같은 해 1월 1일로부터 몇번째 일인지 반환(365)
DayOfWeek getDayOfWeek() 요일에 해당하는 값 반환(5)- Friday

LocalTime ex)23:59:59

메서드 설명
int getHour() 시간 반환(23)
int getMinute() 분 반환(59)
int getSecond() 초 반환(59)
int getNano() 나노초 반환(0)

값 변경하기

LocalDate와 LocalTime클래스에서 특정 필드 값을 변경하려면 with()메서드를 사용한다.
이때 주의해야할 점은 항상 새로운 객체를 생성하여 반환하기 때문에 대입 연산자를 같이 사용해야 한다.

메서드 설명
LocalDate withYear(int year) 연도 필드를 새로운 값으로 설정한 새로운 객체 반환
LocalDate withMonth(int month) 월 필드를 새로운 값으로 설정한 새로운 객체 반환
LocalDate withDayOfMonth(int dayOfMonth) DAY_OF_MONTH 필드를 새로운 값으로 설정한 새로운 객체 반환
LocalDate withDayOfYear(int dayOfYear) DAY_OF_YEAR 필드를 새로운값으로 설정하여 새로운 객체 반환

특정 필드의 값을 더하거나 뺴는데에 plus()메서드와 minus()메서드를 사용한다.

LocalTime present = LocalTime.now();
System.out.println("현재 시각: " + present.get(ChronoField.HOUR_OF_DAY));   // 18

LocalTime otherTime = present.plus(3, ChronoUnit.HOURS);
System.out.println("3시간 후: " + otherTime.getHour()); // 21

LocalTime anotherTime = present.minus(6, ChronoUnit.HOURS);
System.out.println("6시간 전: " + anotherTime.getHour());   // 12

날짜와 시간 비교

LocalDate와 Locatime 클래스에 compareTo()메서드가 오버라이딩 되어있어서 compareTo()로 비교 가능하지만 아래의 메서드들이 추가로 제공된다.
isEquals(): 오직 날짜만 비교(연표가 다른 두 날짜를 비교)
isBefore(): 이전날짜인지 비교
isAfter(): 이후 날짜인지 비교

int result = date.compareTo(date2); // 같으면 0 date가 이전이면 -1, 이후면 1

LocalDate now = LocalDate.now();
LocalDate otherDay = LocalDate.of(2002, 02, 23);

System.out.println(now.compareTo(otherDay));    //18
System.out.println(now.isBefore(otherDay)); //false
System.out.println(now.isEqual(otherDay));  //false
System.out.println(now.isAfter(otherDay));  //true

'프로그래밍 > Java' 카테고리의 다른 글

JVM이란?  (0) 2020.12.22
클래스  (0) 2020.12.18
java8 - Optional  (0) 2020.02.23
java8 변경사항 - 스트림API 최종연산  (0) 2020.02.07
Java8 변경사항 - 스트림API 중간연산  (0) 2020.02.07