Dico

[Java] Class LocalDateTime, ZonedDateTime

package java.time

Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.

4개의 하위 패키지를 가지고 있다.

날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable

Class 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-09-04
LocalTime time = dt.toLocalTime();          // 22:54:41.475

Class ZoendDateTime

LocalDateTime + 시간대(time zone)

GregorianCalendar와 가장 유사하다.

ZonedDateTime zdt = ZonedDateTime.now();    // 2017-09-04T22:55:37.244+09:00[Asia/Seoul]

생성

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

ZonedDateTime zdt = dt.atZone(zi);          // 2017-09-04T22:56:57.319+09:00[Asia/Seoul]
  • LocalDate의 atStartOfDay() 메서드의 매개변수로 ZoneId를 지정하여 ZonedDateTime 얻기.
ZoneId zi = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt = LocalDate.now().atStartOfDay(zi);      // 2017-09-04T00: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-09-04T09:58:33.553-04:00[America/New_York]

ZoneId zi = ZoneId.of("America/Chicago");
ZonedDateTime zdt = ZonedDateTime.now().withZoneSameInstant(zi);     // 2017-09-04T08:58:57.823-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-09-04T23:01:12.848+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-09-04T23:01:48.241+09:00

변환

  • ZonedDateTime의 변환
LocalDate toLocalDate()
LocalTime toLocalTime()
LocalDateTime toLocalDateTime()
OffsetDateTime toOffsetDateTime()
long toEpochSecond()
Instant toInstant()
  • GregorianCalendar와의 변환
GregorianCalendar from(ZonedDateTime zdt)
ZonedDateTime toZonedDateTime()

LocalDateTime API

ZonedDateTime API

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