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의 정석 - 남궁 성
'Programming > Java' 카테고리의 다른 글
Java 삼항식, 삼항연산자(Conditional Operator) 사용하는 방법 (0) | 2021.12.02 |
---|---|
상수와 리터럴 (constant & literal) 정리 (0) | 2021.10.27 |
Java 날짜와 시간을 나타내는 Calendar class (0) | 2021.10.18 |
XML to Java Object 변환하기 JAXB API (4) | 2021.09.28 |
Java 객체 복사 Cloneable interface (0) | 2021.09.16 |