기존 Date, Caledar 클래스의 단점은 Naver D2 - Java의 날짜와 시간 API 에서 잘 설명되어 있다.

이 포스트에선 날짜와 시간을 다루기 위해 자주쓰이는 클래스와 메서드 사용법을 정리하는 것을 목적으로 하겠습니다.

주요 클래스들

LocalTime : 시,분,초 를 표현하는 클래스

LocalDate : 년,월,일을 표현하는 클래스 (ex : 2002-05-09)

LocalDateTime : 년,월,일,시,분,초를 표현하는 클래스 (ex : 2007-12-03T10:15:30)

1. 날짜, 시간 객체 생성하기

날짜 가져오기

LocalDate.now(); // 오늘 
LocalDateTime.now(); // 지금 
LocalDate.of(2015, 4, 17); // 2015년 4월 17일 
LocalDateTime.of(2015, 4, 17, 23, 23, 50); // 2015년 4월 17일 23시 23분 50초 

String -> LocalDateTime 날짜변환

LocalDateTime.parse("2007-12-03T10:15:30"); // 2007-12-03T10:15:30
LocalDateTime.parse("2010-11-25 12:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 2010-11-25T12:30
리턴 타입 메소드(매개변수) 설명
int getHour() 시간
int getMinute()
int getSecond()
int getNano() 나노초

2. 날짜와 시간 조작하기

날짜와 시간을 더하기거나 빼는 메소드

LocalDateTime currentDateTime = LocalDateTime.now();
LocalDateTime targetDateTime = currentDateTime
        .plusYears(long)       // 년도 더하기
        .minusYears(long)      // 년도 빼기
LocalDateTime targetDateTime2 = currentDateTime
        .plusHours(long)       // 시간 더하기
        .minusHours(long)      // 시간 빼기

3. 날짜와 시간을 비교하는 메소드

LocalTime startTime = LocalTime.now();  // 23:52:35.603
LocalTime endTime = LocalTime.of(23, 59, 59);

// startTime이 endTime 보다 이전 시간 인지 비교
startTime.isBefore(endTime);    // true

// startTime이 endTime 보다 이후 시간 인지 비교
startTime.isAfter(endTime); // false

// 동일 날짜인지 비교 
// LocalDate, LocalDateTime에서 사용가능
startDateTime.isEqual(endDateTime);

4. 시간 차이 계산하기

ChronoUnit클래스의 between(Temporal start, Temporal end) 메서드 사용

LocalDate startDate = LocalDate.now(); // 2016-04-02
LocalDate endDate = LocalDate.of(2016,5,5);

ChronoUnit.DAYS.between(startDate, endDate); // 결과 : 33 (1개월 3일)
클래스 설명
ChronoUnit.YEARS 전체 년 차이
ChronoUnit.MONTHS 전체 월 차이
ChronoUnit.WEEKS 전체 주 차이
ChronoUnit.DAYS 전체 일 차이
ChronoUnit.HOURS 전체 시간 차이
ChronoUnit.SECONDS 전체 초 차이
ChronoUnit.MILLIS 전체 밀리초 차이
ChronoUnit.NANOS 전체 나노초 차이

다른방법으로 시간 차이 계산하기

  • LocalDate, LocalTime, LocaDateTime의 until(Temporal end, TemporalUnit unit) 메소드

  • java.time.Duration 클래스의 between(Temporal start, Temporal end) 메소드

5. 날짜 포맷팅

LocalDate, LocalTime, LocaDateTime 클래스의 format(DateTimeFormatter formatter)메소드를 사용해서 원하는 문자열로 변환시킬 수 있다.

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy년 M월 d일 a h시 m분");
String nowString = now.format(dateTimeFormatter);   // 결과 : 2016년 4월 2일 오전 1시 4분

반대로 String을 포맷팅을 통해 시간 객체로 변환 할 수도 있다.

String -> LocalDateTime 변환

LocalDateTime.parse("2018-12-03T10:15:30"); // 2018-12-03T10:15:30
LocalDateTime.parse("2019-03-15 12:30:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 2019-03-15T12:30

LocalDateTime -> String 변환

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatDateTime = now.format(formatter); // 2019-03-09 11:44:44

참조 문서 :

[Document (Java Platform SE 8 ) - Oracle Docs]

eomdev’s blog - 자바8의 java.time 패키지(LocalDate, LocalTime, LocalDateTime 등)

Java 8 – How to format LocalDateTime