Java 8 time package
Java’s new date and time API.
1.8 버전 이전의 자바 진영에서 날짜, 시간을 다루기가 참 어려웠다. 1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 등등 사용자보다는 기계에 친숙한 방식이었다. 예를 들어 아래는 2021년 10월 6일을 가르키는 Date 객체이다.
Date date = new Date(121, 9, 6);
System.out.println("date = " + date);
// date = Wed Oct 06 00:00:00 KST 2021
직관적으로 날짜를 알기 어려울 뿐만 아니라 날짜와 시간의 계산도 사용자에 친숙하지 않은 방법으로 해야 했다.
Date date1 = new Date(121, 9, 6);
Date date2 = new Date(121, 9, 7);
long betweenTime = date2.getTime() - date1.getTime();
int betweenDay = betweenTime / (1000 * 60 * 60 * 24);
// 1000millisecond, 60second, 60min, 24hours 을 곱하여 나눠주면 일이 나온다.
이러한 시간 관련 문제를 Java8 에서는 사용자를 위한 LocalDate, LocalTime 그리고 기계에 쓰이는 Instant 클래스로 나누었다. 이제부터 훨씬 편해진 java 8 api를 사용해 보자.
- LocalDate와 LocalTime
LocalDate와 LocalTime은 개발자에게 알기 쉽게 날짜와 시간에 대한 정보를 제공한다.
LocalDate는 날짜와 관련된 것을 다룰 때, LocalTime은 시간과 관련된 것을 다룰 때 쓰는 객체이다. 날짜와 시간 둘 다 사용해야 한다면 LocalDateTime 객체를 사용 할 수 있다.
LocalDate
API
- 객체 초기화 now(), of(..)
LocalDate date = LocalDate.of(2021, 10, 6); // 2021년 10월 6일
LocalDate nowDate = LocalDate.now(); // 현재 시스템 날짜
LocalTime nowTime = LocalTime.now(); // 현재 시스템 시간
//parse를 통해 String으로도 날짜를 지정 할 수 있다.
LocalDateTime dateTime = LocalDateTime.parse("2021-10-06 11:12:13",
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
참고 : https://krksap.tistory.com/1158
- 날짜, 시간 변경 (with, plus, minus)
with 메서드는 ChronoField 라는 enum을 통해 날짜, 시간 변경을 할 수 있고 plus, minus는 ChronoUnit enum을 통해 더하거나 뺄 수 있다.
하지만 한 눈에 알기 편한 withXXX, plusXXX 메서드를 사용하는 편이 좋다. (내부적으로 Chrono관련된 enum 으로 동작)
(ex: withYear, plusHours…)date.with(ChronoField.DAY_OF_MONTH, 3); // 날짜 3일로 변경 dateTime.withYear(2020); // 년도 2020년으로 변경 dateTime.plus(3, ChronoUnit.MONTHS); dateTime.plusHours(3); // 3시간 더하기 dateTime.minusNanos(10000); // 10000 나노세컨드 빼기
- 비교
// 2. 년도 가져오기
int year = date.getYear(); //2021
int year2 = date.get(ChronoField.DAY_OF_YEAR); // 2021
// 3. 월 가져오기
Month month = date.getMonth(); //10월인 Month 객체
int day = date.getDayOfMonth(); //6
// 4. 일 가져오기
DayOfWeek dow = date.getDayOfWeek(); //WEDNESDAY
int dayOfMonth = date.getDayOfMonth(); // 6
int dayOfYear = date.getDayOfYear(); // 279
// 5. 기타 정보
int leng = date.lengthOfMonth(); //31 (해당 월은 31일 까지)
boolean leap = date.isLeapYear(); //false (윤년여부)
댓글남기기