12. 새로운 날짜와 시간 API
주요내용
- 자바 8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유
 - 사람, 기계가 이해할 수 있는 날짜와 시간 표현 방법
 - 시간의 양
 - 날짜 조정, 파싱, 포매팅
 - 시간대와 캘린더 다루기
 
자바 8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유#
기존 자바에서 2021-09-21 표현하기
- 기존 
Date클래스의 한계- 직관적이지 않음
 - 시간대 정보를 따로 가지지 않고, 중앙 유럽 시간(+00:00)을 사용함
 
 DateFormat이 Thread Safety 를 제공하지 못함Calendar가 1.1에 새로 나왔지만, 쉽게 에러가 나는 문제, month offset 시작점이 0 이라는 문제점이 있음DateCalendar모두 mutable class- 결국 Joda-Time 서드파티의 많은 기능을 
java.time으로 자바 8때 추가됨 
사람, 기계가 이해할 수 있는 날짜와 시간 표현 방법#
- 아래에 살펴볼 
LocalDateLocalTimeLocalDateTimeInstantDurationPeriod는 immutable 임 
LocalDate#
날짜를 표현
LocalDate 사용 예시
TemporalField 이용한 get
LocalTime#
시간을 표현
LocalDateTime#
날짜, 시간을 표현
Instant#
- 기계적인 시간 (epoch) 표현
 - unix epoch time 
1970-01-01T00:00:00Z을 기준으로 특점 지점까지 흘러간 초 
시간의 양#
Duration#
- 초 간격
 LocalTimeLocalDateTimeInstant사이 간격을 지원
Period#
- 날짜 간격
 
날짜 조정, 파싱, 포매팅#
with*, plus*, minus*#
위의 클래스들은 immutable 하기 때문에 withAttribute를 활용하여 일부 값이 바뀐 새로운 객체를 생성할 수 있음 (절대적 방식)
절대적 방식, withAttribute
plusAttribute, minusAttribute 도 있음 (상대적 방식)
상대적 방식, plus|minusAttribute
TemporalAdjusters#
- 복잡한 날짜 조정을 미리 정의해놓음
 with*와 함께 쓸 수 있음
TemporalAdjuster는 함수형 인터페이스이므로 직접 정의도 가능함.with()에 인자로 람다를 넘길 수 있음
TemporalAdjuster 정의
DateTimeFormatter#
- 날짜, 시간을 특정 형식의 문자열로 만들 수 있음
 - Thread Safety 를 제공
 - 지역에 따른 문자열이 반영될 수 있도록, 
Locale포매터를 제공 DateTimeFormatterBuilder를 제공
시간대와 캘린더 다루기#
ZoneId ZonedDateTime#
java.util.TimeZone대신java.time.ZoneId가 등장- 각 지역의 표준 시간대(Timezone) 별로 규칙이 지정되어 있음
 ZonedDateTime=LocalDateTime+ZonedId
ZoneOffset OffsetDateTime#
ZoneId의 서브클래스,ZoneOffsetUTC/GMT기준
대안 캘린더#
- ISO-8601 캘린더를 기반으로 하지만, 그 밖에 4개의 대안의 캘린더를 java 8 에서 제공
 ThaiBuddihistDateMinguoDateJapaneseDateHijrahDate- 위의 대안 캘린더클래스의 LocalDate는 
ChronoLocalDate인터페이스를 구현 
정리#
- java 8에서 이전의 한계를 개선하기위해 시간, 캘린더 시스템을 새로 제공
 - java 8에 새로 제공되는 날짜, 시간 객체는 immutable 함
 - immutable 하기 때문에 새로운 인스턴스로 변형해서 객체를 만드는 팩토리(with, plus, minus 등) 들을 제공
 - 사람, 기계를 위한 두 가지 표현방식을 제공
 - 복잡한 날짜 변환기능을 미리 제공하고 있음 (TemporalAdjuster)
 - 날짜를 특정 포맷으로 바꿔 제공 가능
 - 지역 Timezone이나 Offset으로 시간대를 지정할 수 있음
 - ISO-8601 외의 4개의 대안 캘린더 제공