Android는 일부 Java 8 언어 기능을 지원하지 않습니다.
이 글은 EditPlus로 실행하였습니다.

package java.time

Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.
4개의 하위 패키지를 가지고 있다.
날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable




LocalDateTime

LocalDate + LocalTime
LocalDateTime today = LocalDateTime.now();
LocalDateTime dateTime = LocalDateTime.of(2017, 06, 06, 12, 30, 45);


생성

LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();

LocalDateTime dt = LocalDateTime.of(date, time);
// LocalDateTime dt = date.atTime(time);
// LocalDateTime dt = time.atDate(date);
// LocalDateTime dt = date.atTime(0,0,0);
// LocalDateTime dt = time.atDate(LocalDate.now());
// LocalDateTime dt = date.atStartOfDay();

변환

LocalDate 또는 LocalTime으로 변환
LocalDateTime dt = LocalDateTime.now();
LocalDate date = dt.toLocalDate();          // 2017-06-09
LocalTime time = dt.toLocalTime();          // 09:39:11.149




ZoendDateTime

LocalDateTime + 시간대(time zone)
GregorianCalendar와 가장 유사하다.
ZonedDateTime zdt = ZonedDateTime.now();    // 2017-06-09T09:39:11.150+09:00[Asia/Seoul]


생성

•  LocalDateTime에 atZone()으로 시간대 정보를 추가한다.
LocalDateTime dt = LocalDateTime.now();
ZoneId zi = ZoneId.of("Asia/Seoul");

ZonedDateTime zdt = dt.atZone(zi);          // 2017-06-09T09:39:11.149+09:00{Asia/Seoul]

•  LocalDate의 atStartOfDay() 메서드의 매개변수로 ZoneId를 지정하여 ZonedDateTime 얻기.
ZoneId zi = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt = LocalDate.now().atStartOfDay(zi);      // 2017-06-09T00:00+09:00{Asia/Seoul]

•  ZoneId : 일광 절약 시간을 자동적으로 처리해주는 클래스.
    시간대와 관련된 규칙들을 포함하고 있다.

•  일광 절약 시간제 (DST, Daylight Saving Time / Summer time)
    여름의 일조 시간에 맞춰 3월 두 번째 일요일부터 11월 첫 일요일까지 1시간을 앞당기는 것.
    (3월 두 번째 일요일 2:00AM → 3:00AM, 11월 첫 월요일 2:00AM → 1:00AM 으로 시간 변경)
    여름은 일조 시간이 길기 때문에 한 시간 더 빨리 활동하여 조명과 연료 등 에너지를 절약하고 개인 활동 시간을 늘릴 수 있다는 이유로 시행.
    미국, 캐나다 등에서 시행하고 있다.

현재 특정 시간대의 시간을 알고 싶을 때
ZoneId zi = ZoneId.of("America/New_York");
ZonedDateTime zdt = ZonedDateTime.now().withZoneSameInstant(zi);     // 2017-06-08T20:39:11.173-04:00{America/New_York]

ZoneId zi = ZoneId.of("America/Chicago");
ZonedDateTime zdt = ZonedDateTime.now().withZoneSameInstant(zi);     // 2017-06-08T19:39:11.187-05:00{America/Chicago]

ZoneOffset

UTC로부터 얼마만큼 떨어져 있는 지 표현한다.
시간대를 시간의 차이로만 구분한다.
서울은 +09:00. UTC보다 9시간(60*60*9s) 빠르다.
ZoneOffset zo = ZonedDateTime.now().getOffset();
// ZoneOffset zo = ZoneOffset.of("+9");
int offsetSeconds = zo.get(ChronoField.OFFSET_SECONDS);    // 32400

OffsetDateTime

서로 다른 시간대에 존재하는 컴퓨터간의 통신에 유용하다.

•  LocalDate + LocalTime + ZomeOffset
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
ZoneOffset zo = ZonedDateTime.now().getOffset();

OffsetDateTime odt = OffsetDateTime.of(date, time, zo);    // 2017-06-09T09:39:11.187+09:00

•  ZonedDateTime에 toOffsetDateTime()을 호출하여 얻는다.
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
ZoneId zi = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt = ZonedDateTime.of(date, time, zi);

OffsetDateTime odt = zdt.toOffsetDateTime();               // 2017-06-09T09:39:11.187+09:00

변환

•  ZonedDateTime의 변환
LocalDate toLocalDate()
LocalTime toLocalTime()
LocalDateTime toLocalDateTime()
OffsetDateTime toOffsetDateTime()
long toEpochSecond()
Instant toInstant()

•  GregorianCalendar와의 변환
GregorianCalendar from(ZonedDateTime zdt)
ZonedDateTime toZonedDateTime()



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