[Java] Class LocalDateTime, ZonedDateTime
Javapackage 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()
참고 서적: 자바의 정석 3판 2