상세 컨텐츠

본문 제목

[JAVA] LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

Spring/JAVA

by Chan.94 2024. 8. 27. 14:57

본문

반응형

Calendar를 사용하여 날짜와 시간을 구하는 것에 대해 정리한 적이 있다.

 

Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

 

[JAVA] Calendar (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기

Calendar, SimpleDateFormat Calendar와 SimpleDateFormat을 사용하여 다양한 일자를 계산하는 방법이다. 일자 구하기 Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); sdf.format(cal.getTime()

fvor001.tistory.com

 

자바 8 이상의 버전을 사용하고 있다면 java.time 패키지를 사용하는 것이 바람직하다.


왜 java.time 패키지를 사용해야 하는가

  • util.Date 클래스는 변하기 쉬운( mutable ) 클래스이기 때문에 스레드 안전 ( thread safe ) 하지 않다.
    여러 작업이 동작하면서 내가 예상치 못하게 다른 스레드에서 그 값을 수정하여 다른 값이 전달될 가능성이 있기 때문에 java.time 패키지의 클래스들을 사용해야 한다.
  • 월이 0부터 시작하는 등의 불편함을 가지고 있다.

java.time 패키지

  • LocalDate : 날짜를 표현하는 데 사용하는 클래스
  • LocalTime : 시간을 표현하는 데 사용하는 클래스
  • LocalDateTime : 날짜와 시간을 결합한 클래스

객체의 생성

  • now() : 현재의 날짜와 시간을 이용하여 새로운 객체를 생성하여 반환
  • of() : 전달된 인수를 가지고 특정 날짜와 시간을 표현하는 새로운 객체를 생성하여 반환
// 현재 날짜
LocalDate localDate = LocalDate.now(); // 2024-08-27 

// 특정 날짜 
LocalDate localDate = LocalDate.of(2024, 08, 27);

 

객체의 형변환

LocalDate to String

String currentDate = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDate.now());

 

String to LocalDate

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate currentDate = LocalDate.parse("20240827", formatter);

DateUtils.java

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

public class DateUtil {

    private static final String DEFAULT_DATE_PATTERN = "yyyyMMdd";
    private static final String DEFAULT_TIME_PATTERN = "HHmmss";
    private static final String DEFAULT_DATETIME_PATTERN = "yyyyMMddHHmmss";
    
    /*생성자 사용하지 못하도록*/
    public DateUtil () {}
    
    /**
     * 현재 날짜
     */
    public static String getCurrentDate() {
        return DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN).format(LocalDate.now());
    }
    
    /**
     * 현재 시간
     */
    public static String getCurrentTime() {
    	return DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN).format(LocalDate.now());
    }
    
    /**
     * 현재 날짜 + 시간
     */
    public static String getCurrentDateTime() {
    	return DateTimeFormatter.ofPattern(DEFAULT_DATETIME_PATTERN).format(LocalDateTime.now());
    }

    /**
     * String을 java.time.LocalDate로 변환
     */
    public static LocalDate stringToDate(String date) {
    	return stringToDate(date, DEFAULT_DATE_PATTERN);
    }
    public static LocalDate stringToDate(String date, String pattern) {
    	DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
    	return LocalDate.parse(date, formatter);
    }
    
    /**
     * java.time.LocalDate를 String으로 변환
     */
    public static String dateToString(LocalDate date) {
    	return dateToString(date, DEFAULT_DATE_PATTERN);
    }
    public static String dateToString(LocalDate date, String pattern) {
    	return DateTimeFormatter.ofPattern(pattern).format(date);
    }
    
    /**
     * 내일
     */
    public static String getNextDay() {
        return afterDay(getCurrentDate(), 1);
    }
    /**
     * 일자 더하기
     */
    public static String afterDay(String date, int addDay) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.plusDays(addDay);
        return dateToString(returnDate);
    }
    
    /**
     * 월 더하기
     */
    public static String afterMonthDay(String date, int addMonth) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.plusMonths(addMonth);
        return dateToString(returnDate);
    }
    /**
     * 월 초일
     */
    public static String firstDayOfMonth(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.withDayOfMonth(1);
        return dateToString(returnDate);
    }
    /**
     * 월 말일
     */
    public static String lastDayOfMonth(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.withDayOfMonth(localDate.lengthOfMonth());
        return dateToString(returnDate);
    }
    /**
     * 전월 말일
     */
    public static String beforeMonthLastDay(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.minusMonths(1);
        returnDate = returnDate.withDayOfMonth(returnDate.lengthOfMonth());
        return dateToString(returnDate);
    }
    /**
     * 다음달 말일
     */
    public static String afterMonthLastDay(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = localDate.plusMonths(1);
        returnDate = returnDate.withDayOfMonth(returnDate.lengthOfMonth());
        return dateToString(returnDate);
    }
    /**
     * 년 초일
     */
    public static String firstDayOfYear(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = LocalDate.of(localDate.getYear(), 1, 1);
        return dateToString(returnDate);
    }
    /**
     * 년 말일
     */
    public static String LastDayOfYear(String date) {
        LocalDate localDate = stringToDate(date);
        LocalDate returnDate = LocalDate.of(localDate.getYear(), 12, 31);
        return dateToString(returnDate);
    }
    /**
     * 윤년 체크
     */
    public static boolean leapYearCheck(String date) {
        LocalDate localDate = stringToDate(date);
        return localDate.isLeapYear();
    }
}

 

 

 

반응형

관련글 더보기

댓글 영역

>