Programming/Java

날짜와 시간을 다루는 LocalDate, LocalTime, LocalDateTime (java.time 패키지) 기본 개념

Jan92 2021. 10. 19. 01:18
 

Java 날짜와 시간을 나타내는 Calendar class

[Java] 날짜와 시간을 나타내는 Calender class 날짜와 시간은 어떤 프로젝트에서든 뺄 수 없는 데이터입니다. 개발을 하며 앞으로 계속 사용될 날짜와 시간에 대해 정리하고 싶어서 공부한 내용을 정

wildeveloperetrain.tistory.com

 

java.time 패키지

 

java.time 패키지는 이전 포스팅에서 정리한 jdk1.0에서 나온 Date, jdk1.1에서 나온 Calendar의 단점을 해소하기 위해 jdk1.8부터 사용되었습니다.

 

java.time 패키지 아래에는 4가지 하위 패키지가 존재하는데요.

  • java.time : 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공
  • java.time.chrono : 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공
  • java.time.format : 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공
  • java.time.temporal : 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공
  • java.time.zone : 시간대(time-zone)와 관련된 클래스들을 제공

 

그리고 패키지의 가장 큰 특징은 '불변(immutable)'인데요.

멀티 쓰레드 환경에서는 동시에 여러 스레드가 같은 객체에 접근할 수 있기 때문에 변경 가능한 객체는 데이터가 잘못될 가능성이 있으므로 기존의 객체를 변경하는 대신 항상 변경된 새로운 객체를 반환하게 됩니다.

 

 


 

LocalDate, LocalTime

 

LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();

LocalDate date = LocalDate.of(2021, 10, 18);    // 2021년 10월 18일
LocalTime time = LocalTime.of(23, 59, 59);      // 23시 59분 59초

 

LocalDate와 LocalTime은 java.time 패키지의 가장 기본이 되는 클래스입니다.

now(), of() 메서드를 통해 객체를 생성할 수 있으며 해당 메서드는 둘 다 static 메서드입니다.

 

 

// 문자열을 LocalDate, LocalTime으로 바꾸기 위한 parse() method

LocalDate date = LocalDate.parse("2021-10-18");
LocalTime time = LocalTime.parse("23:59:59");

 

parse() 메서드를 통해 문자열을 날짜(LocalDate)와 시간(LocalTime)으로 변환할 수 있으며,

 

 

 // 특정 필드 값을 가져오기 위한 get() method

 LocalDate date = LocalDate.now();
 date.getYear();         // 년
 date.getMonth();        // 월
 date.lengthOfMonth();   // 같은 달의 총 일수
 
 LocalTime time = LocalTime.now();
 time.getHour();         // 시
 time.getMinute();       // 분

 

get() 메서드로 특정 필드 값을 가져올 수 있습니다.

 

 

// 필드 값 변경에 사용되는 with(), pluse(), minuse()

LocalDate withYear(int year)
LocalDate withMonth(int month)

LocalTime withHour(int hour)
LocalTime withMinute(int minute)

LocalDate plusYears(long yearsToAdd)
LocalDate plusDays(long daysToAdd)

LocalTime plusHours(long hoursToAdd)
LocalTime plusNanos(long nanosToAdd)

.
.

 

필드 값 변경을 위한 with(), plus(), minus() 메서드도 있습니다.

(위 예시는 많은 메서드들 중 일부만을 추린 것입니다.)

 

 

 

또 날짜와 시간을 비교하는 메서드로 'isAfter()', 'isBefore()', 'isEqual()' 세 가지가 존재하는데요.

비교를 위한 메서드로는 기존의 compareTo(), equals() 메서드도 사용 가능하지만 위 메서드가 더 간편하게 사용할 수 있습니다.

 

equals() 메서드와 isEqual() 메서드의 차이점은 equal()의 경우는 연대를 포함한 모든 필드를 비교합니다. 하지만 isEqual()의 경우 오직 날짜만을 비교합니다.

 

 


 

 

LocalDateTime, ZonedDateTime

 

LocalDateTime dateTime = LocalDateTime.of(2021, 10, 19, 1, 6, 10);
LocalDateTime now = LocalDateTime.now();

// LocalDate + LocalTime
LocalDate date = LocalDate.of(2021, 10, 19);
LocalTime time = LocalTime.of(1, 8, 10);

LocalDateTime dt1 = LocalDateTime.of(date, time);
LocalDateTime dt2 = date.atTime(time);
LocalDateTime dt3 = time.atDate(date);
LocalDateTime dt4 = date.atStartOfDay();     // date.atTime(0, 0, 0);

 

LocalDateTime은 기본적으로 of(), now() 메서드를 통해 생성할 수 있고, 또 LocalDate + LocalTime을 가지고도 만들 수 있습니다.

 

 

LocalDateTime now = LocalDateTime.now();
LocalDate date = now.toLocalDate();   // to LocalDate
LocalTime time = now.toLocalTime();   // to LocalTime

 

또한 반대로 LocalDateTime을 가지고 LocalDate, LocalTime을 만들 수도 있습니다.

 

 

// LocalDateTime 으로 ZonedDateTime 만들기
ZoneId zid = ZoneId.of("Asia/Seoul");
ZonedDateTime zdt1 = dateTime.atZone(zid);
ZonedDateTime zdt2 = LocalDate.now().atStartOfDay(zid);

 

LocalDateTime으로 시간대를 가진 ZonedDateTime을 만드는 방법입니다.

그리고 ZonedDateTime 역시 날짜와 시간에 관련된 다른 클래스로 변환하는 메서드들을 가지고 있습니다.

 

ex) toLocalDate(), toLocalTime(), toLocalDateTime(), toInstant() 등

 

 

 

 

 

참고자료

[도서] Java의 정석 - 남궁 성

 

 

java.time (Java Platform SE 8 )

Class Summary  Class Description Clock A clock providing access to the current instant, date and time using a time-zone. Duration A time-based amount of time, such as '34.5 seconds'. Instant An instantaneous point on the time-line. LocalDate A date withou

docs.oracle.com