java 8 정리8

Java 정리 2021. 6. 2. 20:40

인프런 강의 10일차. (9일차에 이어서 같은 Callable 강의)

 - 더 자바, Java 8 (백기선 강사님)

 

1. Date/Time 소개

 - 자바 8에 새로운 날짜와 시간 API가 생긴 이유

 - 그전까지 사용하던 java.util.Date 클래스는 mutable(상태를 바꿀 수 있다)하기 때문에 thread safe하지 않다.

 - 클래스 이름이 명확하지 않다. (Date인데 시간까지 다룬다)

 - 버그 발생할 여지가 많다. (타입 안정성이 없고, 월이 0부터 시작한다거나.. 등등)

 - 날짜 시간 처리가 복잡한 애플리케이션에서는 보통 Joda Time을 쓰곤했다.

 - setTime으로 시간 변경이 가능하기 때문에 mutable하다

 

2. 자바 8에서 제공하는 Date-Time API

 - JSR-310 스팩의 구현체를 제공한다.

 - 디자인 철학

   > Clear

   > Fluent

   > Immutable

   > Extensible

 

3. 주요 API
 - 기계용 시간(machine time)과 인류용 시간(human time)으로 나눌 수 있다.

 - 기계용 시간은 EPOCK (1970년 1월 1일 0시 0분 0초)부터 현재까지의 타임스탬프를 표현한다.

 - 인류용 시간은 우리가 흔히 사용하는 연, 월, 일, 시, 분, 초 등을 표현한다.

 - 타임스탬프는 Instant를 사용한다.

 - 특정 날짜(LocalDate), 시간(LocalTime), 일시(LocalDateTime)을 사용할 수 있다.

 - 기간을 표현할 때는 Duration(시간 기반)과 Period(날짜 기반)을 사용할 수 있다.

 - DateTimeFormatter를 사용해서 일시를 특정한 문자열로 포매팅할 수 있다.

 

4. 현재 시간을 기계 시간으로 표현하는 방법

 - instant.now() : 현재 UTC (GMT)를 리턴한다.

 - Universal Time Coordinated == Greenwich Mean Time

Instant now = Instant.now();
System.out.println(now);
System.out.println(now.atZone(ZoneId.of("UTC")));

ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault());
System.out.println(zonedDateTime);

 

5. 인류용 일시를 표현하는 방법

 - LocalDateTime.now() : 현재 시스템 Zone에 해당하는 로컬 일시를 리턴한다.

 - LocalDateTime.of(int, Month, int, int, int, int) : 로컬의 특정 일시를 리턴한다.

 - ZonedDateTime.of(int, Month, int, int, int, int, ZonedId) : 특정 Zone의 특정 일시를 리턴.

 

6. 기간을 표현하는 방법

 - Period / Duratio . betwwen()

Period between = Period.between(today, birthDay);	//Period : 휴먼시간을 비교
System.out.println(between.get(ChronoUnit.MONTHS));	//Duration : 기계시간을 비교

 

7. 파싱 또는 포맷팅

 - 미리 정의해준 포맷 참고 : docs.oracle.com

 - LocalDateTime.parse(String, DateTimeFormatter);

DateTimeFOrmatter fomatter = DateTimeFormatter.ofPattern("MM/d/yyyy");
LocalDate date = LocalDate.parse("07/15/1982", formatter);
System.out.println(date);
System.out.println(today.format(fomatter));

 

8. 레거시 API 지원

 - GregorianCalendar와 Date 타입의 인스턴스를 Instant나 ZonedDateTime으로 변환 가능

 - java.util.TimeZone에서 java.time.ZoneId로 상호 변환 가능

ZoneId newZoneAPI = TimeZone.getTimeZone("PST").toZoneId();
TimeZone legacyZoneAPI = Time.Zone.getTimeZone(newZoneAPI);
Instant newInstant = new Date().toInstant();
Date legacyInstant = Date.from(newInstant);

 

9. Date 연산

LocalDateTime now = LocalDateTime.now();
now.plus(10, ChronoUnit.DAYS);	//날짜는 immutable 해야하기 때문에 return 받는 변수가 없으면 아무 일도 일어나지 않는다.
LocalDateTime plus10now = now.plus(10, ChronoUnit.DAYS);	//오늘 + 10일을 한 날짜는 새로 변수에 할당

 

'Java 정리' 카테고리의 다른 글

java 8 정리10  (0) 2021.06.30
java 8 정리9  (0) 2021.06.17
java 8 정리7  (0) 2021.05.26
java 8 정리6  (0) 2021.05.21
java 8 정리5  (0) 2021.05.20