본문 바로가기
Java & 스프링/Java

[Java] Java의 날짜와 시간, Time API - (ZonedDateTime, LocalDateTime)

by hjhello423 2019. 10. 12.

자바의 날짜 계산을 도와주는 java.util.Date 클래스와 java.util.Calendar 클래스는 여러모로 불편하기로 악명이 높다.

대학 시절 처음 자바를 접했을 때부터 다른 언어에 비해 불편하다고 생각했는데 모두가 한마음 한뜻이었다.

 

 

Date와  Date를 개선한 Calendar의 불편함을 해소하기 위해 많은 개발자들은 유명한 Joda-Time을 사용했을 것이다.

그런데 java8에서 Joda-Time을 참조해서 Time API를 추가했다고 한다.

바로 java.time이다.

 

일반 Date와 Calendar에서 버그의 위험성이 가장 컸다고 생각되는 불변성이 추가되었다.

immutable 해졌다는 소리인데 덕분에 Date, Calendar 객체의 값이 변경되어 사이드 이펙트가 생길 수 있는 불안정성이 해결되었다.

 

지금부터 ZonedDateTime과 LocalDate, LocalTime 그리고 LocalDateTime의 간단한 사용법을 알아보자.

이들은 immutable 한 객체를 반환한다!

 


먼저 LocalDate, LocalTime 그리고 LocalDateTime을 살펴보자.

이들은 각각 날짜, 시간, 날짜+시간을 표현한다.

 

각각은 now()를 이용해 현재 시간을 가져오던가, of()를 이용해 원하는 날짜 값을 숫자로 지정할 수 있다.

아래의 예제를 살펴보자.

 

of()를 사용할 경우 매개 변수는 2가지 방법으로 지정할 수 있다.

첫 번째, LocalDate와 LocalTime을 사용.

두 번째, (년, 월, 일, 시, 분, 초, 나노초) 순서로 지정

LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.of(18, 30, 40);
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime2 = LocalDateTime.of (2019, 10, 10, 10, 10, 10, 0);
LocalDateTime localDateTime3 =Year.of(2019).atMonth(10).atDay(10).atTime(10, 10, 10);
System.out.println("localDate       : " + localDate);
System.out.println("localTime       : " + localTime);
System.out.println("localDateTime   : " + localDateTime);
System.out.println("localDateTime2  : " + localDateTime2);
System.out.println("localDateTime3  : " + localDateTime3);

 

위 예제의 실행 결과를 살펴보자.

localDate       : 2019-10-12
localTime       : 18:30:40
localDateTime   : 2019-10-12T18:30:40
localDateTime2  : 2019-10-10T10:10:10
localDateTime3  : 2019-10-10T10:10:10

 


다음은 ZonedDateTime을 살펴보자.

ZonedDateTime은 위에서 살펴본 LocalDateTime에 TimeZone 개념이 추가된 것이다.

보통 TimeZone이 "Asia/Seoul"로 default로 지정되어 있을 것이다.

 

타임존을 변경하고 싶을 경우 ZoneId()를 이용하여 변경 가능하다.

기본적인 사용 방법은 LocalDateTime과 비슷하므로 생략한다.

ZonedDateTime nowSeoule = ZonedDateTime.now();
System.out.println("now seoul               : " + nowSeoule);

ZonedDateTime nowNewYork = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("now New York            : " + nowNewYork);

ZonedDateTime time1 = ZonedDateTime.of(2019, 10, 12, 15, 30, 55, 0, ZoneId.of("Asia/Seoul"));
ZonedDateTime time2 = Year.of(2019).atMonth(10).atDay(12).atTime(15, 30, 55).atZone(ZoneId.of("Asia/Seoul"));
System.out.println("time1                   : " + time1);
System.out.println("time2                   : " + time2);
System.out.println("time1, time2 equal?     : " + (time1.equals(time2)));

 

아래는 실행 결과이다.

now New York            : 2019-10-11T22:40:05.021-04:00[America/New_York]
time1                   : 2019-10-12T15:30:55+09:00[Asia/Seoul]
time2                   : 2019-10-12T15:30:55+09:00[Asia/Seoul]
time1, time2 equal?     : true

 


ZonedDateTime과 LocalDateTime를 함께 사용할 수도 있다.

 

사용 예제와 실행 결과를 살펴보자.

LocalDateTime localDateTimeZone = LocalDateTime.of(2019, 10, 10, 10, 10, 10, 0);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTimeZone, ZoneId.of("Asia/Seoul"));
System.out.println("zonedDateTime : " + zonedDateTime);
zonedDateTime : 2019-10-10T10:10:10+09:00[Asia/Seoul]

 


마지막으로 LocalDateTime에 시간을 더하고 빼보자.

더 많은 관련 함수는 아래 링크에서 확인하길 바란다.

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

 

localDateTime = LocalDateTime.of (2019, 10, 10, 10, 10, 10, 0);
System.out.println("localDateTime           : " + localDateTime);
localDateTime = localDateTime.minusDays(30);
System.out.println("localDateTime - 30day   : " + localDateTime);
localDateTime = localDateTime.plusHours(3);
System.out.println("localDateTime + 3hours  : " + localDateTime);

 

실행 결과이다.

localDateTime           : 2019-10-10T10:10:10
localDateTime - 30day   : 2019-09-10T10:10:10
localDateTime + 3hours  : 2019-09-10T13:10:10

 


예제 소스 링크

git : https://github.com/hongjun423/blog_code/blob/f461ead0395ef8e8d4617f202750cf8e9d5b4d89/src/java_time/TimeTest.java

 

doc : 

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

 


정리를 마무리하다 네이버 D2에 괜찮은 글을 발견했다.

이 포스팅을 보신 분들은 꼭 한번 시간 날 때 읽어보길 추천한다.

https://d2.naver.com/helloworld/645609

 

반응형

댓글