12. 새로운 날짜와 시간 API
주요내용
- 자바 8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유
- 사람, 기계가 이해할 수 있는 날짜와 시간 표현 방법
- 시간의 양
- 날짜 조정, 파싱, 포매팅
- 시간대와 캘린더 다루기
#
자바 8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유기존 자바에서 2021-09-21 표현하기
- 기존
Date
클래스의 한계- 직관적이지 않음
- 시간대 정보를 따로 가지지 않고, 중앙 유럽 시간(+00:00)을 사용함
DateFormat
이 Thread Safety 를 제공하지 못함Calendar
가 1.1에 새로 나왔지만, 쉽게 에러가 나는 문제, month offset 시작점이 0 이라는 문제점이 있음Date
Calendar
모두 mutable class- 결국 Joda-Time 서드파티의 많은 기능을
java.time
으로 자바 8때 추가됨
#
사람, 기계가 이해할 수 있는 날짜와 시간 표현 방법- 아래에 살펴볼
LocalDate
LocalTime
LocalDateTime
Instant
Duration
Period
는 immutable 임
LocalDate
#
날짜를 표현
LocalDate 사용 예시
TemporalField 이용한 get
LocalTime
#
시간을 표현
LocalDateTime
#
날짜, 시간을 표현
Instant
#
- 기계적인 시간 (epoch) 표현
- unix epoch time
1970-01-01T00:00:00Z
을 기준으로 특점 지점까지 흘러간 초
#
시간의 양Duration
#
- 초 간격
LocalTime
LocalDateTime
Instant
사이 간격을 지원
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
의 서브클래스,ZoneOffset
UTC/GMT
기준
#
대안 캘린더- ISO-8601 캘린더를 기반으로 하지만, 그 밖에 4개의 대안의 캘린더를 java 8 에서 제공
ThaiBuddihistDate
MinguoDate
JapaneseDate
HijrahDate
- 위의 대안 캘린더클래스의 LocalDate는
ChronoLocalDate
인터페이스를 구현
#
정리- java 8에서 이전의 한계를 개선하기위해 시간, 캘린더 시스템을 새로 제공
- java 8에 새로 제공되는 날짜, 시간 객체는 immutable 함
- immutable 하기 때문에 새로운 인스턴스로 변형해서 객체를 만드는 팩토리(with, plus, minus 등) 들을 제공
- 사람, 기계를 위한 두 가지 표현방식을 제공
- 복잡한 날짜 변환기능을 미리 제공하고 있음 (TemporalAdjuster)
- 날짜를 특정 포맷으로 바꿔 제공 가능
- 지역 Timezone이나 Offset으로 시간대를 지정할 수 있음
- ISO-8601 외의 4개의 대안 캘린더 제공