LocalDateTime, ZonedDateTime
by 민갤
Android는 일부 Java 8 언어 기능을 지원하지 않습니다.
참고 서적: 자바의 정석 3판 2
이 글은 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