반응형
아래 소스 코드는 두 날짜 사이의 차이를 계산하고, 두 날짜 사이의 년도와 월의 배열을 생성 할 수 있으며, 특정일에 대한 월의 마지막 요일과 마지막 날짜를 구하는 소스 코드 입니다. 메서드를 통해서 다양한 날짜 연산 기능을 확인 하실 수 있습니다.
소스코드
ㅇ 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");
}
}
}
반응형
'개발이야기 > Java' 카테고리의 다른 글
[Java] 문자열 자르기, 추출하기 (substring(), split()) (0) | 2023.11.08 |
---|---|
[Java] 문자열 체크하기 (null, 중복, 숫자, 태그) (0) | 2023.08.11 |
[Java] 날짜 포맷 변환하고 활용하기 사용법, 예제 (SimpleDateFormat, Date) (0) | 2023.08.09 |
[Java] 소수점 원하는 자리수 만큼 반올림 하여 출력하기 (Math 클래스) (0) | 2023.08.08 |
[Java] XSS (크로스 사이트 스크립팅), SQL Injection 필터링 하기 (0) | 2023.08.08 |
댓글