on
LocalDate, LocalTime, LocalDateTime (java.time 패키지) 기본 개념
LocalDate, LocalTime, LocalDateTime (java.time 패키지) 기본 개념
java.time 패키지
java.time 패키지는 이전 포스팅에서 정리한 jdk1.0에서 나온 Date, jdk1.1에서 나온 Calendar의 단점을 해소하기 위해 jdk1.8부터 사용되었습니다.
java.time 패키지 아래에는 4가지 하위 패키지가 존재하는데요.
java.time : 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공
: 날짜와 시간을 다루는데 필요한 핵심 클래스들을 제공 java.time.chrono : 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공
: 표준(ISO)이 아닌 달력 시스템을 위한 클래스들을 제공 java.time.format : 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공
: 날짜와 시간을 파싱하고, 형식화하기 위한 클래스들을 제공 java.time.temporal : 날짜와 시간의 필드(field)와 단위(unit)를 위한 클래스들을 제공
: 날짜와 시간의 필드(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의 정석 - 남궁 성
from http://wildeveloperetrain.tistory.com/70 by ccl(A) rewrite - 2021-10-19 01:27:28