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

  1. 객체 초기화 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

  1. 날짜, 시간 변경 (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. 비교


// 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 (윤년여부)

태그:

카테고리:

업데이트:

댓글남기기