DS's『 행복합시다 』

Carpe Programming/javascript

오라클의 add_months, months_between 함수를 자바스크립트로(날짜)

nolite 2012. 3. 20. 11:24
/*
두 기간 이 몇년, 몇개월, 몇일 차이 인지 계산
c_sta_ymd : 시작날짜
c_end_ymd : 종료날짜
c_gubun : 반환받을 날짜 포맷 ex) yy-mm-dd, mm-dd, dd ...
c_sta_yn : 시작일도 포함할지 여부

ex) f_sys_between_ymd(sta_date, end_date, 'yy-mm-dd','y')
*/
function f_sys_between_ymd(c_sta_ymd, c_end_ymd, c_gubun, c_sta_yn) {
var v_sta_ymd, v_end_ymd;
var v_yy, v_mm, v_dd;
var v_yy_t, v_mm_t, v_mm_mod, v_dd_t, v_dd_y_mod, v_mdd_m_mod;
var v_yy_pos, v_mm_pos, v_dd_pos;
var day_value = 24*60*60*1000;
var v_ret = c_gubun;

if (c_sta_ymd == "" || c_end_ymd == "") {
return "";
}

v_sta_ymd = makeDateFormat(c_sta_ymd); // javascript 날짜형변수로 변환
v_end_ymd = makeDateFormat(c_end_ymd); // javascript 날짜형변수로 변환

if (v_sta_ymd == "") return "";
if (v_end_ymd == "") return "";

if (c_sta_yn.toUpperCase() == "Y") {
v_sta_ymd = new Date(v_sta_ymd.getYear(), v_sta_ymd.getMonth(), v_sta_ymd.getDate()-1);
}

v_yy_t = parseInt(months_between(c_end_ymd, c_sta_ymd)/12); // 월 기간 계산
v_mm_t = parseInt(months_between(c_end_ymd, c_sta_ymd)); // 년도 기간 계산
v_mm_mod = parseInt(months_between(c_end_ymd, c_sta_ymd))%12; // 년도 제외한 월 기간 계산
v_dd_t = parseInt((v_end_ymd - v_sta_ymd)/day_value); // 일자 기간 계산
v_dd_y_mod = parseInt((v_end_ymd - add_months(c_sta_ymd, v_yy_t * 12))/day_value); // 년도 제외한 일자 기간 계산
v_dd_m_mod = parseInt((v_end_ymd - add_months(c_sta_ymd, (v_yy_t * 12) + v_mm_mod))/day_value); // 년월 제외한 일자기간 계산
v_yy_pos = c_gubun.indexOf('yy'.toLowerCase(),0); // 년도 구분자 위치 검색
v_mm_pos = c_gubun.indexOf('mm'.toLowerCase(),0); // 월 구분자 위치 검색
v_dd_pos = c_gubun.indexOf('dd'.toLowerCase(),0); // 일자 구분자 위치 검색

if (v_yy_pos > -1 && v_mm_pos > -1 && v_dd_pos > -1) { // yy년 mm월 dd일 형태
v_yy = v_yy_t;
v_mm = v_mm_mod;
v_dd = v_dd_m_mod;
} else if (v_yy_pos > -1 && v_mm_pos > -1 && v_dd_pos == -1) { // yy년 mm월 형태
v_yy = v_yy_t;
v_mm = v_mm_mod;
} else if (v_yy_pos > -1 && v_mm_pos == -1 && v_dd_pos > 0) { // yy년 dd일 형태
v_yy = v_yy_t;
v_dd = v_dd_y_mod;
} else if (v_yy_pos > -1 && v_mm_pos == -1 && v_dd_pos == -1) { // yy년 형태
v_yy = v_yy_t;
} else if (v_yy_pos == -1 && v_mm_pos > -1 && v_dd_pos > -1) { // mm월 dd일 형태
v_mm = v_mm_t;
v_dd = v_dd_m_mod;
} else if (v_yy_pos == -1 && v_mm_pos == -1 && v_dd_pos > -1) { // dd일 형태
v_dd = v_dd_t;
} else if (v_yy_pos == -1 && v_mm_pos > -1 && v_dd_pos == -1) { // mm월 형태
v_mm = v_mm_t;
}

if (v_mm < 10) v_mm = "0" + v_mm;
if (v_dd < 10) v_dd = "0" + v_dd;

//년,월,일 해당 내용 변환
v_ret = v_ret.replace('yy', v_yy);
v_ret = v_ret.replace('mm', v_mm);
v_ret = v_ret.replace('dd', v_dd);

return v_ret;
}
/* yyyymmdd, yyyy-mm-dd, yyyy.mm.dd 를 javascript 날짜형 변수로 변환 */
function makeDateFormat(pdate) {
var yy, mm, dd, yymmdd;
var ar;
if (pdate.indexOf(".") > -1) { // yyyy-mm-dd
ar = pdate.split(".");
yy = ar[0];
mm = ar[1];
dd = ar[2];

if (mm < 10) mm = "0" + mm;
if (dd < 10) dd = "0" + dd;
} else if (pdate.indexOf("-") > -1) {// yyyy.mm.dd
ar = pdate.split("-");
yy = ar[0];
mm = ar[1];
dd = ar[2];

if (mm < 10) mm = "0" + mm;
if (dd < 10) dd = "0" + dd;
} else if (pdate.length == 8) {
yy = pdate.substr(0,4);
mm = pdate.substr(4,2);
dd = pdate.substr(6,2);
}

yymmdd = yy+"/"+mm+"/"+dd;

yymmdd = new Date(yymmdd);

if (isNaN(yymmdd)) {
//alert("날짜 형식이 올바르지 않습니다.");
return false;
}

return yymmdd;
}
/*
오라클의 개월수 더하는 함수와 동일
ex) add_month('2008.04.04',10);
*/
function add_months(pdate, diff_m) {
var add_m;
var lastDay; // 마지막 날(30,31..)
var pyear, pmonth, pday;

pdate = makeDateFormat(pdate); // javascript 날짜형변수로 변환
if (pdate == "") return "";

pyear = pdate.getYear();
pmonth= pdate.getMonth() + 1;
pday = pdate.getDate();

add_m = new Date(pyear, pmonth + diff_m, 1); // 더해진 달의 첫날로 셋팅

lastDay = new Date(pyear, pmonth, 0).getDate(); // 현재월의 마지막 날짜를 가져온다.
if (lastDay == pday) { // 현재월의 마지막 일자라면 더해진 월도 마지막 일자로
pday = new Date(add_m.getYear(), add_m.getMonth(), 0).getDate();
}

add_m = new Date(add_m.getYear(), add_m.getMonth()-1, pday);

return add_m;
}
/*
오라클의 개월수 차이 구하는 함수와 동일
ex) months_between('20080404','2006-01-01');
*/
function months_between(edate, sdate) {
var syear, smonth, sday;
var eyear, emonth, eday;
var diff_month = 1;

sdate = makeDateFormat(sdate); // javascript 날짜형변수로 변환
edate = makeDateFormat(edate); // javascript 날짜형변수로 변환

if (sdate == "") return "";
if (edate == "") return "";

syear = sdate.getYear();
eyear = edate.getYear();
smonth= sdate.getMonth() + 1;
emonth= edate.getMonth() + 1;
sday = sdate.getDate();
eday = edate.getDate();

while (sdate < edate) { // 한달씩 더해서 몇개월 차이 생기는지 검사
sdate = new Date(syear, smonth - 1 + diff_month, 0);
diff_month++;
}

if (sday > eday) diff_month--;

diff_month = diff_month - 2;

return diff_month;
}

728x90

'Carpe Programming > javascript' 카테고리의 다른 글

[javascript] Event.KeyCode  (0) 2012.03.28
Jquery SELECT 태그 관련 내용  (0) 2012.03.22
[jQuery] tablesorter  (1) 2012.03.19
[javascript ]세로 스크롤 제거  (0) 2011.11.23
[tooltip]본문미리보기_마우스따라다님  (0) 2011.11.16