개발이야기/Java

[Java] 날짜 차이 계산하기 (일수 차이, 년도/월, 마지막 날짜)

후린개발자 2023. 8. 10.
반응형

아래 소스 코드는 두 날짜 사이의 차이를 계산하고, 두 날짜 사이의 년도와 월의 배열을 생성 할 수 있으며, 특정일에 대한 월의 마지막 요일과 마지막 날짜를 구하는 소스 코드 입니다. 메서드를 통해서 다양한 날짜 연산 기능을 확인 하실 수 있습니다.

 

소스코드

 

ㅇ getProperFormat : 주어진 날짜 문자열의 길이에 따라 적절한 포맷의 날짜 형식을 반환합니다.

ㅇ toCalendar : 날짜 문자열을 Calendar 객체로 변환하는 메서드입니다. 주어진 날짜 문자열을 적절한 포맷으로 파싱하여 Calendar 객체로 반환합니다.

ㅇ dateDiff : 두 날짜 사이의 일 수 차이를 계산합니다. 오버로딩된 메서드 중 하나는 시작일과 종료일을 포함하거나 포함하지 않는 옵션을 설정할 수 있습니다.

ㅇ calBetweenYear : 두 날짜 사이의 년도 배열을 반환합니다. 시작년부터 종료년까지의 연도 배열을 생성합니다.

ㅇ calBetweenYearMonth : 두 날짜 사이의 년도/월 조합 배열을 반환합니다. 시작년월부터 종료년월까지의 년도/월 조합 배열을 생성합니다.

ㅇ getLastDayOfMonth : 주어진 날짜에 해당하는 달의 마지막 날짜를 반환합니다.

ㅇ getLastDateOfMonth : 주어진 년도-월 문자열에 해당하는 달의 마지막 날짜를 포함하는 날짜를 반환합니다.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;

public class TT {
    
    public static final String LONG_DATE_STR = "yyyy-MM-dd HH:mm:ss";
    public static final String LONG_DATE_STR_FILE = "yyyyMMddHHmmss";
    public static final String SHORT_DATE_STR = "yyyy-MM-dd";
    public static final String MIN_SHORT_DATE_STR = "yyyyMMdd";
    
    public static final SimpleDateFormat DEFAULT_DATETIME_FORMAT = new SimpleDateFormat(LONG_DATE_STR);
    public static final SimpleDateFormat DEFAULT_DATETIME_FORMAT_FILE = new SimpleDateFormat(LONG_DATE_STR_FILE);
    public static final SimpleDateFormat MIN_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
    public static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat(SHORT_DATE_STR);
    public static final SimpleDateFormat DEFAULT_SHORT_DATE_FORMAT = new SimpleDateFormat(MIN_SHORT_DATE_STR);
    public static final int MILLI_SEC_A_DAY = 1000 * 60 * 60 * 24;
    
    private static DateFormat getProperFormat(String dateStr) {
        DateFormat format;
        if (dateStr.length() == SHORT_DATE_STR.length()) {
            format = DEFAULT_DATE_FORMAT;
        } else {
            format = DEFAULT_DATETIME_FORMAT;
        }
        return format;
    }
    /**
     * 날짜 String을 Calendar 객체로 변환해주는 메소드.
     *
     * @param dateStr
     * @return
     */
    public static Calendar toCalendar(String dateStr) {
        DateFormat format = getProperFormat(dateStr);

        Date convDate = null;
        try {
            convDate = format.parse(dateStr);
        } catch (ParseException e) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(convDate);

        return calendar;
    }
    /**
     * 두 날짜 사이의 일 수 차이 계산 예) 2008-03-05 - 2008-03-02 날짜차이는 4일
     *
     * @param destDate
     * @param srcDate
     * @return
     */
    public static long dateDiff(String destDate, String srcDate) {
        return dateDiff(destDate, srcDate, true);
    }

    /**
     * 날짜차이구함
     *
     * @param destDate
     * @param srcDate
     * @param containStartEndDt
     *            시작,종료일 포함 true: 2008-03-05 - 2008-03-02 => 4 false: 2008-03-05 -
     *            2008-03-02 => 3
     * @return
     */
    public static long dateDiff(String destDate, String srcDate, boolean containStartEndDt) {
        long diffDate = 0;
        try {
            if (StringUtils.isNotEmpty(destDate) && destDate.length() >= SHORT_DATE_STR.length() && StringUtils.isNotEmpty(srcDate)
                    && srcDate.length() >= SHORT_DATE_STR.length()) {
                Date destDt = DEFAULT_DATE_FORMAT.parse(destDate);
                Date srcDt = DEFAULT_DATE_FORMAT.parse(srcDate);

                diffDate = new Long((destDt.getTime() - srcDt.getTime()) / MILLI_SEC_A_DAY);

                if (containStartEndDt) {
                    diffDate += 1;
                }
            }
        } catch (Exception ignore) {
        }
        return diffDate;
    }

    /**
     * 두 날짜 사이의 년도 배열 가져오기
     * @param fromDt
     * @param toDt
     * @return
     */
    public static String[] calBetweenYear(String fromDt, String toDt) {
        if(StringUtils.isBlank(fromDt) || StringUtils.isBlank(toDt)) {
            return null;
        }
        String[] retArray = new String[0];

        Calendar fromCal = toCalendar(fromDt);
        Calendar toCal = toCalendar(toDt);

        int fromYear = fromCal.get(Calendar.YEAR);
        int toYear = toCal.get(Calendar.YEAR);

        for (; fromYear <= toYear; fromYear++) {
            retArray = (String[]) ArrayUtils.add(retArray, fromYear + "");
        }

        return retArray;
    }

    /**
     * 두 날짜 사이의 년도/월 조합 배열 가져오기
     * @param fromDt
     * @param toDt
     * @return
     */
    public static String[] calBetweenYearMonth(String fromDt, String toDt) {
        if(StringUtils.isBlank(fromDt) || StringUtils.isBlank(toDt)) {
            return null;
        }
        String[] retArray = new String[0];

        Calendar fromCal = toCalendar(fromDt);
        Calendar toCal = toCalendar(toDt);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");

        int fromYM = 0;
        int toYM = 0;
        do {
            fromYM = Integer.parseInt(sdf.format(fromCal.getTime()));
            toYM = Integer.parseInt(sdf.format(toCal.getTime()));

            retArray = (String[]) ArrayUtils.add(retArray, fromYM + "");
            fromCal.add(Calendar.MONTH, 1);
        } while (fromYM < toYM);

        return retArray;
    }
    
    /**
     * 주어진 달의 마지막 일 가져오기
     * @param yyyy.mm.dd
     * @return
     */
    public static int getLastDayOfMonth(String dateStr) {
        Calendar calendar = toCalendar(dateStr);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    
    /**
     * 주어진 달의 마지막 날짜 가져오기
     * @param dateStr yyyy-MM or yyyy-MM-dd
     * @return yyyy-MM-dd
     */
    public static String getLastDateOfMonth(String dateStr) {
        if(dateStr == null || dateStr.length() < 7) {
            return "";
        }
        String deli = SHORT_DATE_STR.substring(4, 5);
        String str = dateStr.substring(0, 7) + deli + "01";
        
        return  dateStr.substring(0, 7) + deli + StringUtils.leftPad(getLastDayOfMonth(str) + "", 2, "0");
    }
    
    public static void main(String[] args) throws Exception { 
        String fromDate = "2022-01-15";
        String toDate = "2023-08-10";

        // Calendar 객체로 변환
        Calendar fromCal = TT.toCalendar(fromDate);
        Calendar toCal = TT.toCalendar(toDate);

        if (fromCal != null && toCal != null) {
            // 두 날짜 사이의 일 수 차이 계산
            long daysDiff = TT.dateDiff(toDate, fromDate);
            System.out.println("일 수 차이: " + daysDiff);

            // 시작일과 종료일을 포함하지 않고 두 날짜 사이의 일 수 차이 계산
            long daysDiffWithoutStartEnd = TT.dateDiff(toDate, fromDate, false);
            System.out.println("시작과 종료일 제외한 일 수 차이: " + daysDiffWithoutStartEnd);

            // 두 날짜 사이의 년도 배열 가져오기
            String[] yearsBetween = TT.calBetweenYear(fromDate, toDate);
            System.out.println("두 날짜 사이의 년도 배열: " + Arrays.toString(yearsBetween));

            // 두 날짜 사이의 년도/월 조합 배열 가져오기
            String[] yearMonthBetween = TT.calBetweenYearMonth(fromDate, toDate);
            System.out.println("두 날짜 사이의 년도/월 배열: " + Arrays.toString(yearMonthBetween));

            // 주어진 달의 마지막 일 가져오기
            int lastDayOfMonth = TT.getLastDayOfMonth("2023-02-15");
            System.out.println("해당 달의 마지막 일: " + lastDayOfMonth);

            // 주어진 달의 마지막 날짜 가져오기
            String lastDateOfMonth = TT.getLastDateOfMonth("2023-02");
            System.out.println("해당 달의 마지막 날짜: " + lastDateOfMonth);
        } else {
            System.out.println("NO DATA");
        }
    }
}

 

 

반응형

댓글

💲 추천 글