본문 바로가기
Java

[Java] Date Util

by Real Iron 2019. 2. 13.

출처 : https://github.com/numver0zero/Spring/blob/master/Spring/src/main/java/com/spring/util/DateUtil.java


package com.spring.util;


import java.text.FieldPosition;

import java.text.ParsePosition;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.sql.Timestamp;



/**

 * 날자 관련 유틸

 * @author SungBok Kim

 *

 */

public class DateUtil {

/**

* 현제 날자시간을 반환 한다

* @return yyyy-MM-dd HH:mm:ss

*/

public static String getNowDateTime() {

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

return formatter.format(Calendar.getInstance().getTime());

}

/**

* 현제 날자를 8자리로 반환 한다

* @return yyyyMMdd

*/

public static String getNowDate() {

SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

return formatter.format(Calendar.getInstance().getTime());

}

/**

* 현제 시간을 6자리로 반환 한다

* @return HHmmss

*/

public static String getNowTime() {

SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");

return formatter.format(Calendar.getInstance().getTime());

}

/**

* 현제 날자 및 시간을 원하는 포멧으로 반환한다

* @param dFormat

* yyyy 년, MM 월, dd 일

* HH 24시, mm 분, ss 초

* aa 오전/오후, hh 12시

* ww 년에 있어서 주(수치)

* DDD 년에 있어서 날(수치)

* F 월에 있어서 요일(수치)

* @return String

*/

public static String getDateFormat(String dFormat) {

SimpleDateFormat formatter = new SimpleDateFormat(dFormat);

return formatter.format(Calendar.getInstance().getTime());

}

/**

* <pre>

* 월의 마지막 일 을 구한다

* sDate(yyyyMMdd or yyyy-MM-dd)

* </pre>

* @param sDate

* @return day(String)

*/

public static int getLastDayOfMonth(String sDate) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return 0;

} else {

//yyyy-MM-dd 에서 - 를 제외하고 yyyyMMdd 형태가 아니면 0리턴

sDate = sDate.replaceAll("-", "");

if(sDate.length() != 8) {

return 0;

} else {

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(sDate.substring(0, 4)), (Integer.parseInt(sDate.substring(4, 6))-1), 1); //년월일셋팅

return cal.getActualMaximum(Calendar.DAY_OF_MONTH);

}

}

}


/**

* <pre>

* 날짜를 받아서 해당하는 요일을 숫자로 리턴한다

* sDate(yyyyMMdd or yyyy-MM-dd)

* </pre>

* @param sDate

* @return int 요일(1:일,2:월,3:화,4:수,5:목,6:금,7:토)

*/

public static int getDayOfWeek(String sDate) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return 0;

}

sDate = sDate.replaceAll("-", "");

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(sDate.substring(0, 4)), (Integer.parseInt(sDate.substring(4, 6))-1), Integer.parseInt(sDate.substring(6, 8)));

int nTmp = cal.get(Calendar.DAY_OF_WEEK);

return nTmp;

}

/**

* 날자 숫자를 받아 한글 요일로 리턴한다

* @param dayOfWeek

* @return String (1:일요일,2:월요일,3:화요일,4:수요일,5:목요일,6:금요일,7:토요일)

*/

public static String getDayOfWeekToKOR(int dayOfWeek) {

String dayStrKOR = "";

switch(dayOfWeek) {

case 1 :

dayStrKOR = "일요일";

break;

case 2 :

dayStrKOR = "월요일";

break;

case 3 :

dayStrKOR = "화요일";

break;

case 4 :

dayStrKOR = "수요일";

break;

case 5 :

dayStrKOR = "목요일";

break;

case 6 :

dayStrKOR = "금요일";

break;

case 7 :

dayStrKOR = "토요일";

break;

default :

dayStrKOR = "";

break;

}

return dayStrKOR;

}

/**

* 날자 숫자를 받아 영어 요일로 리턴한다

* @param dayOfWeek

* @return String (1:SUNDAY,2:MONDAY,3:TUESDAY,4:WEDNESDAY,5:THURSDAY,6:FRIDAY,7:SATURDAY)

*/

public static String getDayOfWeekToENG(int dayOfWeek) {

String dayStrKOR = "";

switch(dayOfWeek) {

case 1 :

dayStrKOR = "SUNDAY";

break;

case 2 :

dayStrKOR = "MONDAY";

break;

case 3 :

dayStrKOR = "TUESDAY";

break;

case 4 :

dayStrKOR = "WEDNESDAY";

break;

case 5 :

dayStrKOR = "THURSDAY";

break;

case 6 :

dayStrKOR = "FRIDAY";

break;

case 7 :

dayStrKOR = "SATURDAY";

break;

default :

dayStrKOR = "";

break;

}

return dayStrKOR;

}

/**

* 입력받은 날자가 몇째 주 인지 리턴한다(셋팅된 년도 기준)

* @param sDate yyyyMMdd or yyyy-MM-dd

* @return int 주 (비교에러 -1)

*/

public static int getWeekOfYear(String sDate) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return -1;

}

sDate = sDate.replaceAll("-", "");

String yyyy = sDate.substring(0, 4);

String MM = sDate.substring(4, 6);

String dd = sDate.substring(6, 8);

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd)); //년월일셋팅

return cal.get(Calendar.WEEK_OF_YEAR);

}

/**

* 입력받은 날자가 몇째 주 인지 리턴한다(셋팅된 월 기준)

* @param sDate yyyyMMdd or yyyy-MM-dd

* @return int 주 (비교에러 -1)

*/

public static int getWeekOfMonth(String sDate) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return -1;

}

sDate = sDate.replaceAll("-", "");

String yyyy = sDate.substring(0, 4);

String MM = sDate.substring(4, 6);

String dd = sDate.substring(6, 8);

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd)); //년월일셋팅

return cal.get(Calendar.WEEK_OF_MONTH);

}

/**

* 입력받은 날자가 몇째 날 인지 리턴한다(셋팅된 년 기준)

* @param sDate yyyyMMdd or yyyy-MM-dd

* @return int 주 (비교에러 -1)

*/

public static int getDayOfYear(String sDate) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return -1;

}

sDate = sDate.replaceAll("-", "");

String yyyy = sDate.substring(0, 4);

String MM = sDate.substring(4, 6);

String dd = sDate.substring(6, 8);

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd)); //년월일셋팅

return cal.get(Calendar.DAY_OF_YEAR);

}

/**

* 날자를 원하는 포멧으로 반환한다

* @param sDate yyyyMMdd or yyyy-MM-dd

* @param delim ex("-")

* @return String delim format 형식으로 리턴

*/

public static String getDateFormat(String sDate, String delim) {

//yyyyMMdd 이거나 yyyy-MM-dd 가 아니면 0리턴

if(sDate == null || (sDate.length() != 8 && sDate.length() != 10) || (sDate.length() == 10 && sDate.indexOf("-") == -1)) {

return "";

}

sDate = sDate.replaceAll("-", "");

String yyyy = sDate.substring(0, 4);

String MM = sDate.substring(4, 6);

String dd = sDate.substring(6, 8);

String dateFormat = yyyy + delim + MM + delim + dd;

return dateFormat;

}

/**

* 시간을 원하는 포멧으로 반환한다

* @param sTime HHmmss or HH:mm:ss

* @return String delim format 형식으로 리턴

*/

public static String getTimeFormat(String sTime, String delim) {

//hhmmss 이거나 hh:mm-ss 가 아니면 0리턴

if(sTime == null || (sTime.length() != 6 && sTime.length() != 8) || (sTime.length() == 8 && sTime.indexOf(":") == -1)) {

return "";

}

sTime = sTime.replaceAll(":", "");

String hh = sTime.substring(0, 2);

String mm = sTime.substring(2, 4);

String ss = sTime.substring(4, 6);

String timeFormat = hh + delim + mm + delim + ss;

return timeFormat;

}


/**

* 날자 및 시간을 원하는 포멧으로 반환한다 (yyyy-MM-dd HH:mm:ss)

* @param dFormat

* yyyy 년, MM 월, dd 일

* HH 24시, mm 분, ss 초

* aa 오전/오후, hh 12시

* ww 년에 있어서 주(수치)

* DDD 년에 있어서 날(수치)

* F 월에 있어서 요일(수치)

* @return String

*/

public static String getDateTimeFormat(String sDateTime, String dFormat) {

if(sDateTime == null || sDateTime.equals("")) {

return "";

}

if(dFormat == null || dFormat.equals("")) {

dFormat = "yyyy-MM-dd HH:mm:ss";

}

sDateTime = sDateTime.replaceAll("-", "");

sDateTime = sDateTime.replaceAll(":", "");

sDateTime = sDateTime.replaceAll(" ", "");

if(sDateTime.length() != 14) {

return "";

} else {

String yyyy = sDateTime.substring(0, 4);

String MM = sDateTime.substring(4, 6);

String dd = sDateTime.substring(6, 8);

String hh = sDateTime.substring(8, 10);

String mm = sDateTime.substring(10, 12);

String ss = sDateTime.substring(12, 14);

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(yyyy), Integer.parseInt(MM)-1, Integer.parseInt(dd), Integer.parseInt(hh), Integer.parseInt(mm), Integer.parseInt(ss)); //년월일시분초셋팅

SimpleDateFormat formatter = new SimpleDateFormat(dFormat);

return formatter.format(cal.getTime());

}

}

/**

* <pre>

* 날자 및 시간을 원하는 포멧으로 반환한다 (yyyy-MM-dd HH:mm:ss)

* yyyy 년, MM 월, dd 일

* HH 24시, mm 분, ss 초

* aa 오전/오후, hh 12시

* ww 년에 있어서 주(수치)

* DDD 년에 있어서 날(수치)

* F 월에 있어서 요일(수치)

* </pre>

* @param sDateTime

* @return String

*/

public static Date getDate(String sDateTime) {

if(sDateTime == null || sDateTime.equals("")) {

return null;

}

sDateTime = sDateTime.replaceAll("-", "");

sDateTime = sDateTime.replaceAll(":", "");

sDateTime = sDateTime.replaceAll(" ", "");

if(sDateTime.length() != 14) {

return null;

} else {

String yyyy = sDateTime.substring(0, 4);

String MM = sDateTime.substring(4, 6);

String dd = sDateTime.substring(6, 8);

String hh = sDateTime.substring(8, 10);

String mm = sDateTime.substring(10, 12);

String ss = sDateTime.substring(12, 14);

Calendar cal = Calendar.getInstance();

cal.set(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd), Integer.parseInt(hh), Integer.parseInt(mm), Integer.parseInt(ss)); //년월일시분초셋팅

return cal.getTime();

}

}


/**

* 두날짜의 간격을 계산한다

* @param startDate yyyyMMdd or yyyy-MM-dd

* @param endDate yyyyMMdd or yyyy-MM-dd

* @param type 어느것을 계산할 것인가("YEAR" : 년도, "MONTH" : 월, "DAY":일)

* @return int 날짜간의 차이 (오류시 -1)

*/

public static int dateDiff(String startDate, String endDate, String type) {

if(startDate == null || endDate == null || startDate.equals("") || endDate.equals("")

|| (startDate.length() != 8 && startDate.length() != 10) || (startDate.length() == 10 && startDate.indexOf("-") == -1)

|| (endDate.length() != 8 && endDate.length() != 10) || (endDate.length() == 10 && endDate.indexOf("-") == -1)) {

return -1;

}

startDate = startDate.replaceAll("-", "");

endDate = endDate.replaceAll("-", "");

if("YEAR".equals(type.toUpperCase())) {

return Integer.parseInt(startDate.substring(0, 4)) - Integer.parseInt(endDate.substring(0, 4));

} else if ("MONTH".equals(type.toUpperCase())) {

return (Integer.parseInt(startDate.substring(0, 4)) - Integer.parseInt(startDate.substring(0, 4))) * 12 

+ (Integer.parseInt(endDate.substring(4, 6)) - Integer.parseInt(endDate.substring(4, 6)));

} else if("DAY".equals(type.toUpperCase())) {

Calendar cal = Calendar.getInstance();

Calendar cal2 = Calendar.getInstance();

cal.set(Integer.parseInt(startDate.substring(0, 4)), Integer.parseInt(startDate.substring(4, 6)) - 1, Integer.parseInt(startDate.substring(6, 8)));

cal2.set(Integer.parseInt(endDate.substring(0, 4)), Integer.parseInt(endDate.substring(4, 6)) - 1, Integer.parseInt(endDate.substring(6, 8)));

return (int)Math.floor(Math.abs(cal2.getTime().getTime() - cal.getTime().getTime()) / 0x5265c00L);

} else {

return -1;

}

}


/**

* 두시간의의 간격을 계산한다

* @param startTime 시작시간(HHmmss or HH:mm-ss)

* @param endTime 종료시간(HHmmss or HH:mm-ss)

* @return int 시간차이(초단위, 오류시-1)

*/

public static int timeDiff(String startTime, String endTime) {

if(startTime == null || endTime == null || startTime.equals("") || endTime.equals("")

|| (startTime.length() != 6 && startTime.length() != 8) || (startTime.length() == 8 && startTime.indexOf(":") == -1)

|| (endTime.length() != 6 && endTime.length() != 8) || (endTime.length() == 8 && endTime.indexOf(":") == -1)) {

return -1;

}

startTime = startTime.replaceAll(":", "");

endTime = endTime.replaceAll(":", "");

int st_sec = Integer.parseInt(startTime.substring(0, 2)) * 3600

+ Integer.parseInt(startTime.substring(2, 4)) * 60

+ Integer.parseInt(startTime.substring(4, 6));

int to_sec = Integer.parseInt(endTime.substring(0, 2)) * 3600

+ Integer.parseInt(endTime.substring(2, 4)) * 60

+ Integer.parseInt(endTime.substring(4, 6));

return to_sec - st_sec;

}

/**

* 날자시간의 차이를 계산하여 같거나 작음, 큼을 반환한다

* @param startDateTime 시작날자시간(yyyy-MM-dd HH:mm:ss)

* @param endDateTime 종료날자시간(yyyy-MM-dd HH:mm:ss)

* @return int 

* 시작날자시간이 크면 : 1,

* 시작날자시간이 같으면 : 0,

* 시작날자시간이 작으면 : -1

* 비교할수없으면 -99

*/

public static int compareTo(String startDateTime, String endDateTime) {

if(startDateTime == null || endDateTime == null || startDateTime.equals("") || endDateTime.equals("")) {

return -99;

}

startDateTime = startDateTime.replaceAll("-", "");

startDateTime = startDateTime.replaceAll(":", "");

startDateTime = startDateTime.replaceAll(" ", "");

endDateTime = endDateTime.replaceAll("-", "");

endDateTime = endDateTime.replaceAll(":", "");

endDateTime = endDateTime.replaceAll(" ", "");

if(startDateTime.length() != 14 || endDateTime.length() != 14) {

return -99;

} else {

String sYyyy = startDateTime.substring(0, 4);

String sMM = startDateTime.substring(4, 6);

String sDd = startDateTime.substring(6, 8);

String sHh = startDateTime.substring(8, 10);

String sMm = startDateTime.substring(10, 12);

String sSs = startDateTime.substring(12, 14);

Calendar sCal = Calendar.getInstance();

sCal.set(Integer.parseInt(sYyyy), Integer.parseInt(sMM), Integer.parseInt(sDd), Integer.parseInt(sHh), Integer.parseInt(sMm), Integer.parseInt(sSs)); //년월일시분초셋팅

String eYyyy = endDateTime.substring(0, 4);

String eMM = endDateTime.substring(4, 6);

String eDd = endDateTime.substring(6, 8);

String eHh = endDateTime.substring(8, 10);

String eMm = endDateTime.substring(10, 12);

String eSs = endDateTime.substring(12, 14);

Calendar eCal = Calendar.getInstance();

eCal.set(Integer.parseInt(eYyyy), Integer.parseInt(eMM), Integer.parseInt(eDd), Integer.parseInt(eHh), Integer.parseInt(eMm), Integer.parseInt(eSs)); //년월일시분초셋팅

return sCal.compareTo(eCal);

}

}


/**

* TimeMillis 를 yyyy-MM-dd HH:mm:ss 형으로 반환

* @param ltimes

*/

public static String milsecTotime(String ltimes) {

String timeStampToString = (new Timestamp(Long.parseLong(ltimes))).toString();

return timeStampToString.substring(0, 19);

}

/**

* 현재일자를 반환한다.(형식 yyyyMMdd)

*

* @return 현재일자

* @throws Exception

*/

    public static String getToday() throws Exception {

return getDate(new Date(), "yyyyMMdd");

}

/**

*  Date 타입의 날짜를  지정한 형식의 문자형 날짜로 반환한다.

*

* @param pDate Date 객체

* @param pFormat SimpleDateFormat에 정의된 날짜형식

* @return 변경된 날짜

*/

public static String getDate(Date pDate, String pFormat) throws Exception {


        if(pDate == null)

            return "";


StringBuffer ret = new StringBuffer();

new SimpleDateFormat(pFormat).format(pDate, ret, new FieldPosition(0));

return ret.toString();

}


/**

*  String 타입의 날짜를  지정한 형식의 Date 타입의 날짜로 반환한다.

*

* @param strDate String 타입의 날짜

* @param pFormat SimpleDateFormat에 정의된 날짜형식

* @return 변경된 날짜

*/

public static Date getDate(String strDate, String pFormat) throws Exception {

if( strDate == null )

return null;


return new SimpleDateFormat(pFormat).parse(strDate, new ParsePosition(0));

}




/**

*  현재 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.

*

* @param offset 이동할 일수( -2147483648 ~ 2147483647 )

* @return 변경된 날짜

*/

public static String getOffsetDate(int offset) throws Exception {

    Date date = new Date();

    return getOffsetDate(date, offset, "yyyyMMdd");

}

/**

*  현재 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.(형식 지정)

*

* @param offset 이동할 일수( -2147483648 ~ 2147483647 )

* @return 변경된 날짜

*/

public static String getOffsetDate(int offset, String pFormat) throws Exception {

    Date date = new Date();

    return getOffsetDate(date, offset, pFormat);

}

/**

*  지정된 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.(디폴트형식 yyyyMMdd)

*

* @param strDate 지정된 일자(String)

* @param offset 이동할 일수( -2147483648 ~ 2147483647 )

* @return 변경된 날짜

*/

public static String getOffsetDate(String strDate, int offset) throws Exception {

    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");

    Date date = fmt.parse(strDate);

    return getOffsetDate(date, offset, "yyyyMMdd");

}

/**

*  지정된 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.(형식 지정)

*

* @param strDate 지정된 일자(String)

* @param offset 이동할 일수( -2147483648 ~ 2147483647 )

* @return 변경된 날짜

*/

public static String getOffsetDate(String strDate, int offset, String pFormat) throws Exception {

    SimpleDateFormat fmt = new SimpleDateFormat(pFormat);

    Date date = fmt.parse(strDate);

    return getOffsetDate(date, offset, pFormat);

}

/**

*  지정된 날짜에서 원하는 일수 만큼 이동된 날짜를 반환한다.(형식 지정)

*

* @param pDate Date 객체

* @param offset 이동할 일수( -2147483648 ~ 2147483647 )

* @param pFormat 날짜형식

* @return 변경된 날짜

*/

public static String getOffsetDate(Date pDate, int offset, String pFormat) throws Exception {

    SimpleDateFormat fmt = new SimpleDateFormat(pFormat);

    Calendar c = Calendar.getInstance();

    String ret = "";


    try {

        c.setTime(pDate);

        c.add(Calendar.DAY_OF_MONTH, offset);

        ret = fmt.format(c.getTime());

    }

    catch(Exception e) {

    }

    return ret;

}


}