[Java] package java.time
JavaAndroid는 일부 Java 8 언어 기능을 지원하지 않습니다.
해당 글은 EditPlus로 실행하였습니다.
package java.time
Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.
4개의 하위 패키지를 가지고 있다.
날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable
- java.time
날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공.
시간(시분초)과 더 큰 개념의 시간(년월일시분초)을 구분하기 위해 time 대신 temporal과 chrono 용어를 사용함.
- java.time.chrono
표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공.
- java.time.format
날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공.
- java.time.temporal
날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공.
- java.time.zone
시간대(time-zone)와 관련된 클래스들을 제공.
핵심 클래스
- 날짜와 시간이 별도의 클래스로 분리되어 있다.
LocalDate | 날짜를 표현 |
---|---|
LocalTime | 시간을 표현 |
LocalDateTime | 날짜와 시간을 모두 표현 |
ZonedDateTime | 날짜와 시간, 시간대(time-zone)을 다룬다 |
- 날자와 시간의 간격을 표현하는 클래스
Period | 두 날짜간의 차이를 표현 |
---|---|
Duration | 시간의 차이를 표현 |
- 객체 생성하기
java.time 패키지에 속한 클래스의 객체를 생성하는 가장 기본적인 방법.
now() | 현재 날짜와 시간을 저장하는 객체를 생성 |
---|---|
of() | 해당 필드의 값을 순서대로 지정하여 생성 |
- Temporal, TemporalAccessor, TemporalAdjuster 인터페이스를 구현한 클래스
날짜와 시간을 표현하기 위한 클래스들.
LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant 등
- TemporalAmount 인터페이스를 구현한 클래스
Duration, Period
- TemporalUnit과 TemporalField
TemporalUnit 인터페이스 | 날짜와 시간의 단위를 정의해 놓은 것 |
---|---|
열거형 ChronoUnit | TemporalUnit을 구현한 것 |
TemporalField 인터페이스 | 년, 월, 일 등 날짜와 시간의 필드를 정의해 놓은 것 |
열겨형 ChronoField | TemporalField를 구현한 것 |
- 날짜와 시간에서 특정 필드의 값만 얻기
get(), get으로 시작하는 이름의 메서드
- 특정 날짜와 시간에서 지정된 단위의 값을 더하거나 빼기
plus()/minus()에 값과 함께 열거형 ChronoUnit을 사용한다.
Instant
에포크 타임(EPOCH TIME, 1970-01-01 00:00:00 UTC)부터 경과된 시간을 나노초 단위로 표현한다.
시간을 초 단위와 나노초 단위로 나누어 저장한다.
단일 진법으로 다루기 때문에 계산이 편리하다.
항상 UFC(+00:00)를 기준으로 하기 때문에 LocalTime과 차이가 있을 수 있다.
LocalTime time = LocalTime.now();
Instant now = Instant.now();
System.out.println(time); // 22:49:14.899
System.out.println(now); // 2017-08-30T13:49:14.900Z
시간대를 고려해야 하는 경우 OffsetDateTime을 사용하는 것이 나을 수 있다.
- UFC (Coordinated Universal Time)
세계 협정시
1972년 1월 1일부터 시행된 국제 표준시
GMT(Greenwich Mean Time)와 거의 같지만 좀 더 정확하다.
- 생성
now()와 ofEpochSecond()를 사용한다.
static Instant now()
static Instant now(Clock clock)
static Instant ofEpochSecond(long epochSecond, long nanoAdjustment)
static Instant ofEpochSecond(long epochSecond)
Instant now1 = Instant.now();
Instant now2 = Instant.ofEpochSecond(now1.getEpochSecond());
Instant now3 = Instant.ofEpochSecond(now1.getEpochSecond(), now1.getNano());
- long getEpochSecond()
필드에 저장된 값을 가져온다.
long epochSec = now1.getEpochSecond(); // 1504101113
int nano = now1.getNano(); // 577000000
- long toEpochMilli()
밀리초 단위의 EPOCh TIME
System.out.println(now.toEpochMilli()); // 1504101172466
- Instant와 Date간의 변환
Instant는 기존의 java.util.Date를 대체하기 위한 것이며, JDK1.8부터 Date에 Instant로 변환할 수 있는 새로운 메서드가 추가되었다.
static Date from(Instant instant) // Instant → Date
Instant toInstant() // Date → Instant
참고 서적: 자바의 정석 3판 2