Android는 일부 Java 8 언어 기능을 지원하지 않습니다.
Android Studio 2.1 이상 버전에서는 Jack toolchain을 사용하여 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);         // 13:55:13.023
System.out.println(now);          // 2017-06-05T04:55:13.023Z

시간대를 고려해야 하는 경우 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();      // 1496637563
int nano = now1.getNano();                  // 924000000


•  long toEpochMilli()
    밀리초 단위의 EPOCh TIME
System.out.println(now.toEpochMilli());     // 1496638682369


•  Instant와 Date간의 변환
    Instant는 기존의 java.util.Date를 대체하기 위한 것이며,
    JDK1.8부터 Date에 Instant로 변환할 수 있는 새로운 메서드가 추가되었다.
static Date from(Instant instant)      // Instant → Date
Instant toInstant()                    // Date → Instant




•  참고 서적: 자바의 정석 3판 2