본문 바로가기

개발언어/JavaFunction

자바 모던하게 LocalDate클래스와 LocalDateTime클래스를 이용하여 날짜 계산하는 방법

자바 8이전에는 날짜를 계산할 때 Date 클래스와 Calendar 클래스를 이용했다.

하지만 설계가 잘못되어있어 개발할 때 소스코드가 지저분해지고 신경 써야 할 부분이 많아진다.

예를 들면 Calendar 클래스의 경우 달을 출력할 때 1월의 경우 0을 리턴한다.

System.out.println(calendar.get(Calendar.MONTH)+1); //현재 1월이라면 0을 리턴하기 때문에 +1을 해 주야 한다.

반면에 1일을 출력하려고 할 때는 0이 아니라 1을 리턴한다.

System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //1일의 경우 달과 달리 1을 그대로 리턴하기 때문에 +1을 해줄 필요가 없다.

 

이러한 문제점만 아니라 자바 스레드 처리 등에서 생기는 다양한 문제로 인해 자바 8부터 LocalDate 클래스와 LocalDateTime 클래스가 등장했다. 하지만 구글링을 해보면 대부분의 소스들이 자바 8 이전의 방식으로 날짜를 계산하고 있어 조금 안타깝다.

아직까지 현업에서도 상당히 뒤처져있는 모습을 볼 수 있다. 신규 프로젝트의 경우에도 자바 8에서 출시된 기능은 거의 쓰지 않고 자바 8이전의 기능으로 코딩을 한다.

모던 자바 방식으로 날짜를 구하는 소스를 보자.

 

import java.io.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {
    public static void main(String[] args) throws IOException {

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
        LocalDate date = LocalDate.parse("2021 07 31", formatter);
        System.out.println(date.minusYears(1));  //2020-07-31
        System.out.println(date.minusMonths(1)); //2021-06-30
        System.out.println(date.minusWeeks(1));  //2021-07-24
        System.out.println(date.minusDays(1));   //2021-07-30
        date = LocalDate.now();
        System.out.println(date); //2021-07-07

        LocalDateTime dateTime = LocalDateTime.now();
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        System.out.println(dateTime.format(timeFormatter));                //2021-07-07
        System.out.println(dateTime.minusYears(1).format(timeFormatter));  //2020-07-07
        System.out.println(dateTime.minusMonths(1).format(timeFormatter)); //2021-06-07
        System.out.println(dateTime.minusWeeks(1).format(timeFormatter));  //2021-06-30
        System.out.println(dateTime.minusDays(1).format(timeFormatter));   //2021-07-06

    }
}

 

소스코드를 보면 무엇을 의미하는지 알 것이다. 해당 연월일에서 년을 빼거나 달을 빼거나 주를 빼거나 일을 빼거나 소스코드로 아주 심플하게 작성할 수 있다.