DevBoi

[Java] Java 8 날짜 API 본문

Language/[Java]

[Java] Java 8 날짜 API

HiSmith 2022. 4. 6. 12:12
반응형

기존 날짜 APi의 문제점

날짜를 의미하는 Date라는 클래스는 이름과 달리 특정 시점을 날짜가 아닌 밀리초단위로 표현한다.

 

1) 불볍 객체가 아니다.

불변 객체의장점인 스레드 안정성, 여러객체에서 안전한 공유가 아니라, 

가변 클래스이다. 그래서 setter메서드가 존재하여, 객체 공유시에 부작용이 생길 수 있다.

 

2) 0부터 시작하는 월 지정 인덱스

Date클래스는 1월을 0으로 표현한다. 이는 실수를 유발하게 된다.

Date.getDay()메서드로 요일을 가져오면, 0부터 시작하고 Calendar를 통해 가져오면 일요일이 1로 시작한다.

둘 사이에도 일관성이 없다.

 

 

3) 확장성 문제

Date는 JVM의 기본 시간대인 (CET)를 사용한다. 또한 Date클래스가 자체적으로 시간대 정보를 알고 있지도 않다

Date 클래스의 toString으로 반환되는 문자열을 활용하기도 어렵다

 

 

신규 API

-LocalDate

불변 객체이다.

 

LocalDate.of 정적 팩토리 메서드로 인스턴스를 만들 수 있다.

LocalDate date = LocalDate.of(2017, 9, 21);

LocalDate.now 로 시스템 시계의 정보를 이용해서 현재 날짜 정보를 얻는다.

LocalDate today = LocalDate.now();//2021-09-26 출력

LocalDate.get 메서드에 TemporalFiled를 전달해서 정보를 얻는 방법도 있다.

int year = date.get(ChronoField.YEAR);

int month = date.get(ChronoField.MONTH_OF_YEAR);

int day = date.get(ChronoField.DAY_OF_MONTH);

 

 

 

LocalTime + LocalDate  복합 클래스인

LocalDateTime이 존재한다. 

 

LocalDateTime dt1 = LocalDateTime.of(2017, 9, 21, 13, 45, 20);//년,월,일,시,분,초를 모두 받는 경우

LocalDateTime dt2 = LocalDateTime.of(date, time);//LocalDate, LocalTime을 받는 경우

 

 

LocalDate date = LocalDate.of(2017, 9, 21);

LocalTime time = LocalTime.of(13, 45, 20);

LocalDateTime dt1 = date.atTime(time);

LocalDateTime dt2 = time.atDate(date);

 

해당 LocalDateTime은, LocalDate, LocalTime 으로 변환 및 가공이 양방향으로 가능하다.

 

 

날짜 조정

새로 추가된 날짜,시간 객체들은 불변객체이므로, 변경이 필요한 경우, 메서드를 제공해준다.

포맷 변경

 

지정된 포맷이 아닌 신규로 생성한 포맷으로도 생성이 가능하다.

 

 

추가)

타임존을 사용할 수 있다.

Zone에 대한 규약이 있고, 해당 값을 ZoneId라는 객체로 별도로 뺄수 있다.

해당 존을 사용하여, 시스템 날짜 객체 기준인 Instance나 localDate를 생성 및 변환할 수 있다.

 

 

 

ZonedDateTime zdt1 = localDate.atStartOfDay(romeZone);

ZonedDateTime zdt2 = dateTime.atZone(romeZone);

ZonedDateTime zdt3 = instant.atZone(romeZone);

 

Instant instant = Instant.now(); LocalDateTime timeFromInstant = LocalDateTime.ofInstant(instant, romeZone);

 

 

인스턴스는 Unix time 을 기준으로 특정 지점까지의 시간을 초로 표현한 것이다.

Unix time은 시스템에서 날짜와 시간의 흐름을 나타낼때 기준을 삼는 시간을 의미한다.

 

 

위 두가지 의 개념도 신규로 추가되었다. 참고하자

 

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] JUnit4 와 JUnit5차이  (0) 2022.04.07
CDN이란?  (0) 2022.04.06
[Java] 예외 전파  (0) 2022.04.06
[Java] CheckedException, UncheckedException  (0) 2022.04.05
[Java] Enum 추상 클래스  (0) 2022.04.05