자주 사용하는 Date 관련 Util 모음이다...
마찬가지로 프로삽질러들의 삽질을 조금이라도 줄여 줄수 있으면 좋겠다...
나 역시도 많은 삽질을 줄였기에...
GitHub에 가서 TestMain 실행해 보면 샘플 몇개 있습니다...
그리고 좀 내어놓기 부끄러운 코드들이 많이 있습니다...ㅡㅡ;;;
너그러이 양해 부탁 드립니다.
public class GizmoDateUtil {
public static final int TYPE_DOT = 1;
public static final int TYPE_SLASH = 2;
public static final int TYPE_DASH = 3;
/**
* 특정 날짜를 받아서 Date객체로 리턴한다.
* @param sDate 소스날짜.
* @param sFormat 소스날짜의 포맷
* @return
*/
public static Date toDateFromStringDate(String sDate, String sFormat){
SimpleDateFormat fromFormat = new SimpleDateFormat(sFormat);
Date date = new Date();
try {
date = fromFormat.parse(sDate);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;
}
/**
* 인자로 받은 date객체에서 특정구분(년, 월, 일)의 i의 값만큼
* 더하거나 뺀다.
* 예) date : 20170110, div : D, i : 5
* 결과 : 20170105
* @param date 대상 날짜의 date객체
* @param div 계산할 구분 (Y:년도, M:월, D:일)
* @param i 더하거나 뺄 숫자
* @return
*/
public static Date doDateCalc(Date date, String div, int i){
Calendar cal = new GregorianCalendar(Locale.KOREA);
cal.setTime(date);
if(div.equalsIgnoreCase("Y")){
cal.add(Calendar.YEAR, i);
}
else if(div.equalsIgnoreCase("M")){
cal.add(Calendar.MONTH, i);
}
else if(div.equalsIgnoreCase("D")){
cal.add(Calendar.DAY_OF_YEAR, i);
}
return cal.getTime();
}
/**
* 인자로 받은 date객체에서 특정구분(년, 월, 일)의 i의 값만큼
* 더하거나 뺀다.
* 예) date : 20170110, div : D, i : 5
* 결과 : 20170105
* @param date 대상 날짜의 date객체
* @param fromFormat 대상 날짜(date)의 날짜 포맷
* @param div 계산할 구분 (Y:년도, M:월, D:일)
* @param i 더하거나 뺄 숫자
* @Example doDateCalc("2019-11-19", "yyyy-MM-dd", "D", 1)
* @return Date
*/
public static Date doDateCalc(String date, String fromFormat, String div, int i) throws ParseException{
Calendar cal = new GregorianCalendar(Locale.KOREA);
SimpleDateFormat format = new SimpleDateFormat(fromFormat);
Date dt = format.parse(date);
cal.setTime(dt);
if(div.equalsIgnoreCase("Y")){
cal.add(Calendar.YEAR, i);
}
else if(div.equalsIgnoreCase("M")){
cal.add(Calendar.MONTH, i);
}
else if(div.equalsIgnoreCase("D")){
cal.add(Calendar.DAY_OF_YEAR, i);
}
return cal.getTime();
}
/**
* 특정 날짜에 대하여 요일을 구함(일 ~ 토)
* @param date
* @param fromFormat
* @return
* @throws Exception
*/
public static String getWeekDay(String date, String fromFormat) throws Exception {
String day = "" ;
SimpleDateFormat dateFormat = new SimpleDateFormat(fromFormat) ;
Date nDate = dateFormat.parse(date) ;
Calendar cal = Calendar.getInstance() ;
cal.setTime(nDate);
int dayNum = cal.get(Calendar.DAY_OF_WEEK) ;
switch(dayNum){
case 1:
day = "일";
break ;
case 2:
day = "월";
break ;
case 3:
day = "화";
break ;
case 4:
day = "수";
break ;
case 5:
day = "목";
break ;
case 6:
day = "금";
break ;
case 7:
day = "토";
break ;
}
return day ;
}
/**
* 오늘날짜를 리턴한다.
* @return SimpleDateFormat
*/
public static SimpleDateFormat getTimeStampFormat(){
SimpleDateFormat timeStamp = new SimpleDateFormat("yyyyMMddHHmmss"); // 날짜 시간으로 파일명 지정
return timeStamp;
}
/**
* 오늘 날짜를 String으로 리턴한다.
* @param formatStr : yyyyMMddHHmmss 식의 포맷을 받는다.
* @return String
*/
public static String getTimeStampFormat(String formatStr){
SimpleDateFormat timeStamp = new SimpleDateFormat(formatStr); // 날짜 시간으로 파일명 지정
// timeStamp.format(new Date());
return timeStamp.format(new Date()).toString();
}
/**
* <pre>
* 문자열 형태의 날짜를 원하는 형태로 변환합니다.
*
* 예시)
* "yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
* "EEE, MMM d, ''yy" Wed, Jul 4, '01
* "h:mm a" 12:08 PM
* "hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
* "K:mm a, z" 0:08 PM, PDT
* "yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
* "EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
* "yyMMddHHmmssZ" 010704120856-0700
* "yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
* </pre>
*
* @param date 변환할 날짜
* @param fromFormatString date 파라미터의 포맷
* @param toFormatString 변환될 포맷
* @return 변환된 날짜 문자열
*/
public static String formattedDate(String date, String fromFormatString, String toFormatString) throws ParseException {
SimpleDateFormat fromFormat = new SimpleDateFormat(fromFormatString);
SimpleDateFormat toFormat = new SimpleDateFormat(toFormatString);
Date fromDate = null;
fromDate = fromFormat.parse(date);
// try{
// }
// catch(ParseException e){
// fromDate = new Date();
// }
return toFormat.format(fromDate);
}
/**
* <pre>
* 날짜를 원하는 형태의 문자열로 반환합니다.
* </pre>
*
* @param date 변환할 Date 인스턴스
* @param format 변환할 포맷
* @return 변환된 날짜 문자열
*/
public static String formattedDate(Date date, String format){
SimpleDateFormat toFormat = new SimpleDateFormat(format);
return toFormat.format(date);
}
/**
* 날짜 형식으로 변경하여 리턴한다.
* @param date 날짜문자열
* @return 날짜 형식 (yyyy년mm월dd일)
*/
public static String formatDate(String date) {
return formatDate(date, 0);
}
/**
* 주어진 포멧유형에 따라 날짜 형식으로 변경하여 리턴한다.
* @param date 날짜문자열
* @param type (TYPE_DOT: '.', TYPE_SLASH: '/', 아니면 한글형식)
* @return 날짜형식 (yyyy.mm.dd, yyyy/mm/dd, yyyy년mm월dd일)
*/
public static String formatDate(String date, int type) {
if (null == date) return "";
StringBuilder sb = new StringBuilder();
if (date.length() == 6) {
switch (type) {
case TYPE_DOT:
sb.append(StringUtils.substring(date, 0, 4)).append(".").append(StringUtils.substring(date, 4));
break;
case TYPE_SLASH:
sb.append(StringUtils.substring(date, 0, 4)).append("/").append(StringUtils.substring(date, 4));
break;
case TYPE_DASH:
sb.append(StringUtils.substring(date, 0, 4)).append("-").append(StringUtils.substring(date, 4));
break;
default:
sb.append(StringUtils.substring(date, 0, 4)).append("년").append(StringUtils.substring(date, 4)).append("월");
}
}
else if (date.length() == 8) {
switch (type) {
case TYPE_DOT:
sb.append(StringUtils.substring(date, 0, 4)).append(".").append(StringUtils.substring(date, 4, 6)).append(".").append(StringUtils.substring(date, 6));
break;
case TYPE_SLASH:
sb.append(StringUtils.substring(date, 0, 4)).append("/").append(StringUtils.substring(date, 4, 6)).append("/").append(StringUtils.substring(date, 6));
break;
case TYPE_DASH:
sb.append(StringUtils.substring(date, 0, 4)).append("-").append(StringUtils.substring(date, 4, 6)).append("-").append(StringUtils.substring(date, 6));
break;
default:
sb.append(StringUtils.substring(date, 0, 4)).append("년").append(StringUtils.substring(date, 4, 6)).append("월").append(StringUtils.substring(date, 6)).append("일");
}
}
else {
return date;
}
return sb.toString();
}
/**
* Date 객체로 받은 fromDate, toDate 두 날짜 사이의 몇일이 차이나는지 계산을 해서 return 한다.
* @param fromDate 시작일
* @param toDate 종료일
* @return 두 날짜 사이 차이나는 일수.
*/
public static int doCompareDate(Date fromDate, Date toDate) {
long dates = toDate.getTime() - fromDate.getTime();
int compareDate = Integer.parseInt( String.valueOf(dates/(24*60*60*1000)) );
return compareDate;
}
/**
* 문자로 받은 fromDate, toDate 두 날짜 사이의 몇일이 차이나는지 계산을 해서 return 한다.
* Example)
* doCompareDate("2021-01-01", "yyyy-MM-dd", "2021-02-17", "yyyy-MM-dd")
* doCompareDate("2021-01-01", "yyyy-MM-dd", "20210217", "yyyyMMdd")
* doCompareDate("20210101", "yyyyMMdd", "2021/02/17", "yyyy/MM/dd")
* doCompareDate("202101", "yyyyMM", "2021/02", "yyyy/MM")
* @param fromDateStr 시작일의 문자열
* @param fromDateFromat 시작일 문자열의 날짜 포맷(ex: yyyy-MM-dd, yyyyMMdd, yy/MM/dd)
* @param toDateStr 종료일의 문자열
* @param toDateFormat 종료일 문자열의 날짜 포맷(ex: yyyy-MM-dd, yyyyMMdd, yy/MM/dd)
* @return
*/
public static int doCompareDate(String fromDateStr, String fromDateFromat, String toDateStr, String toDateFormat) throws ParseException {
Date fromDate = toDateFromStringDate(fromDateStr, fromDateFromat);
Date toDate = toDateFromStringDate(toDateStr, toDateFormat);
long dates = toDate.getTime() - fromDate.getTime();
int compareDate = Integer.parseInt( String.valueOf(dates/(24*60*60*1000)) );
return compareDate;
}
}