[JavaScript] 날짜 계산
var monarr = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
/************************************************************************************
getDateDays(date) : 날자의 총일수를 리턴하는 함수
사용예) getDateDaus('20040101');
*************************************************************************************/
function getDateDays(date)
{
var year = new Number(date.substring(0,4));
var month = new Number(date.substring(4,6));
var day = new Number(date.substring(6,8));
var value = year * 12 * 30 + month * 30 + day;
return value;
}
function getSQLDateString(date) {
if(date == null) {
date = new Date();
}
var sDate = '';
if (date.getYear() < 2000) {
sDate += (date.getYear() + 1900);
} else {
sDate += date.getYear();
}
sDate += '-';
if(date.getMonth() < 9) {
sDate += '0' + (date.getMonth()+1);
} else {
sDate += (date.getMonth()+1);
}
sDate += '-';
if(date.getDate() < 10) {
sDate += '0' + (date.getDate());
} else {
sDate += (date.getDate());
}
return sDate;
}
//현재일자의 전후 일자
// 예) 현재일자 7일전 getCalSQLDateString(-7)
// 예) 현재일자 7일후 getCalSQLDateString(7)
function getCalSQLDateString(pday) {
date = new Date();
newDate = new Date();
var newtimems = date.getTime()+(pday*24*60*60*1000);
newDate.setTime(newtimems);
var sDate = '';
if (newDate.getYear() < 2000) {
sDate += (newDate.getYear() + 1900);
} else {
sDate += newDate.getYear();
}
sDate += '-';
if(newDate.getMonth() < 9) {
sDate += '0' + (newDate.getMonth()+1);
} else {
sDate += (newDate.getMonth()+1);
}
sDate += '-';
if(newDate.getDate() < 10) {
sDate += '0' + (newDate.getDate());
} else {
sDate += (newDate.getDate());
}
return sDate;
}
/************************************************************************************
getBetweenMonths( sdate, edate ) : 기간의 총 개월수를 리턴하는 함수
사용예) getBetweenMonth('20000101', '20040101');
*************************************************************************************/
function getBetweenMonth(sdate, edate)
{
var value = (getDateDays(edate) - getDateDays(sdate));
value = Math.round( value / 30 );
return value;
}
/************************************************************************************
getBetweenDays( sdate, edate ) : 기간의 총 일수를 리턴하는 함수
사용예) getBetweenDays('20000101', '20040101');
*************************************************************************************/
function getBetweenDays( sdate, edate )
{
var value = (getDateDays(edate) - getDateDays(sdate));
return value;
}
/************************************************************************************
getMonthDay(year, month) : 해당 년/월의 최종 일수를 반환
사용예) getMonthDay(2000, 4);
*************************************************************************************/
function getMonthDay(year, month) {
if ((((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) && month==2) {
date = 29;
} else {
date = monarr[month-1];
}
return date;
}
/************************************************************************************
getThisYearCurrYM() : 오늘이 속한 달을 0000-00형식으로 반환
사용예) getToday();
*************************************************************************************/
function getThisYearCurrYM() {
var today = new Date();
var yyyy = today.getYear();
var mm = (today.getMonth() + 1);
mm = formatNN(mm);
var date = yyyy + "-" + mm;
return date;
}
/************************************************************************************
getCurrMonthLastDay() : 오늘이 속한 달의 말일을 0000-00-00형식으로 반환
사용예) getToday();
*************************************************************************************/
function getCurrMonthLastDay() {
var today = new Date();
var yyyy = today.getYear();
var mm = (today.getMonth() + 1);
mm = formatNN(mm);
var date = yyyy + "-" + mm + "-" + getMonthDay(yyyy, mm);
return date;
}
/************************************************************************************
getToday() : 오늘 날자를 0000-00-00형식으로 반환
사용예) getToday();
*************************************************************************************/
function getToday() {
var today = new Date();
var yyyy = today.getYear();
var mm = (today.getMonth() + 1);
mm = formatNN(mm);
var dd = today.getDate();
dd = formatNN(dd);
var date = yyyy + "-" + mm + "-" + dd;
return date;
}
function formatNN(num) {
var result = "";
num = Number(num);
if (num < 10) {
result = "0" + num;
} else {
result = num;
}
return result;
}
/************************************************************************************
검색조건일자의 전후일자 구하기
// 예) 검색조건일자 7일전 getCalSQLDateString1(pdate,-7)
// 예) 검색조건일자 7일후 getCalSQLDateString1(pdate,7)
*************************************************************************************/
function getCalSQLDateString2(pdate,pday) {
date = new Date(pdate.substring(0,4), parseInt(pdate.substring(4,6),10)-1, parseInt(pdate.substring(6,8),10));
newDate = new Date();
var newtimems = date.getTime()+(pday*24*60*60*1000);
newDate.setTime(newtimems);
var sDate = '';
if (newDate.getYear() < 2000) {
sDate += (newDate.getYear() + 1900);
} else {
sDate += newDate.getYear();
}
sDate += '-';
if(newDate.getMonth() < 9) {
sDate += '0' + (newDate.getMonth()+1);
} else {
sDate += (newDate.getMonth()+1);
}
sDate += '-';
if(newDate.getDate() < 10) {
sDate += '0' + (newDate.getDate());
} else {
sDate += (newDate.getDate());
}
return sDate;
}
//날짜의'-' 빼기
function sDelDate(data) {
return data.replaceAll("-", "");
}
//시간의':' 빼기
function sDelHour(data) {
return data.replaceAll(":", "");
}
//형식으로 리턴하는 함수
function dateFormat(strDate) {
var date = "";
if(strDate.indexOf("-") > -1) return strDate;
if(strDate != "") {
var year = "";
var month = "";
var day = "";
if(strDate.length == 6){
year = strDate.substring(0, 4);
month = strDate.substring(4, 6);
date = year+"-"+month
}else if(strDate.length == 8){
year = strDate.substring(0, 4);
month = strDate.substring(4, 6);
day = strDate.substring(6, 8);
date = year+"-"+month+"-"+day
}
}
return date;
}
//날짜 validation check 함수
function checkDate(obj)
{
var ymd = obj.value;
var year;
var month;
var day;
var dash;
var febEndday;
if( obj.value.length == 0 ) {
return true;
}
if( obj.value.length != 10 ){
alert("날짜를 잘못 입력하였습니다.");
obj.value="";
obj.focus();
return false;
}
var isNanVlaue;
if( obj.value.length < 5 ) {
isNanVlaue = obj.value;
}
if( obj.value.length == 5 ) {
if(obj.value.substring(4,5) != "-" ) {
alert("날짜를 잘못 입력하였습니다.");
obj.value = "";
obj.focus();
return false;
}
isNanVlaue = obj.value.substring(0,4);
}
if( obj.value.length == 6 || obj.value.length == 7 || obj.value.length == 8 ) {
if(obj.value.substring(7,8) != "-" ) {
alert("날짜를 잘못 입력하였습니다.");
obj.value = "";
obj.focus();
return false;
}
isNanVlaue = (obj.value.substring(0,4)+obj.value.substring(5,7));
}
if( obj.value.length == 9 || obj.value.length == 10 ) {
isNanVlaue = (obj.value.substring(0,4)+obj.value.substring(5,7)+obj.value.substring(8,10));
}
if(isNaN(isNanVlaue) == true ) {
alert("숫자로 입력해 주세요.");
obj.value = "";
obj.focus();
return false;
}
year = ymd.substring(0,4); // 년도
month = ymd.substring(5,7); // 월
day = ymd.substring(8,10); // 일
if (month > 12 || month < 01 || ymd.length < 10 || day <= 00)
{
alert("월이 잘못 되었습니다.(예 : 01 ~ 12)");
obj.value ="";
obj.focus();
return false; // 월>12,월<1,년월일:8자리이하,년월일:Non Numeric, 일:00이하 -> return false
}
else if (month == 01 || month == 03 || month == 05 || month == 07 ||
month == 08 || month == 10 || month == 12)
{
if (day > 31){
alert("날짜가 잘못 되었습니다.(예 : 01~ 31)");
obj.value ="";
obj.focus();
return false; // 1월, 3월, 5월, 7월, 8월, 10월, 12월 : 일 -> 31 초과이면 return false
}
}
else if (month == 04 || month == 06 || month == 09 || month == 11)
{
if (day > 30){
alert("날짜가 잘못 되었습니다.(예 : 01 ~ 30)");
obj.value ="";
obj.focus();
return false; // 4월, 6월, 9월, 11월 : 일 -> 30 초과이면 return false
}
}
else if (month == 02) // 2월인 경우
{
if (year % 400 == 0)
febEndday = 29; // 년도가 400으로 나눠질 경우 마지막날은 29일
else if (year % 100 == 0)
febEndday = 28; // 년도가 100으로 나눠질 경우 마지막날은 28일
else if (year % 4 == 0)
febEndday = 29; // 년도가 4 로 나눠질 경우 마지막날은 29일
else
febEndday = 28; // 나머지 경우의 마지막날은 28일
if (day > febEndday) {
alert("날짜가 잘못 되었습니다.(예 : 01 ~ "+febEndday+")");
obj.value ="";
obj.focus();
return false; // 일이 마지막날보다 크면 return false;
}
}
return true;
}
//날짜 validation check 함수
function checkDateYM(obj){
var ymd = obj.value;
var year;
var month;
var dash;
var febEndday;
if( obj.value.length == 0 ) {
return true;
}
if( obj.value.length != 7 ){
alert("날짜를 잘못 입력하였습니다.");
obj.value="";
obj.focus();
return false;
}
var isNanVlaue;
if( obj.value.length < 5 ) {
isNanVlaue = obj.value;
}
if( obj.value.length == 5 ) {
if(obj.value.substring(4,5) != "-" ) {
alert("날짜를 잘못 입력하였습니다.");
obj.value = "";
obj.focus();
return false;
}
isNanVlaue = obj.value.substring(0,4);
}
if( obj.value.length == 6 || obj.value.length == 7 ) {
isNanVlaue = (obj.value.substring(0,4)+obj.value.substring(5,7));
}
if(isNaN(isNanVlaue) == true ) {
alert("숫자로 입력해 주세요.");
obj.value = "";
obj.focus();
return false;
}
year = ymd.substring(0,4); // 년도
month = ymd.substring(5,7); // 월
if (month > 12 || month < 01 || ymd.length < 7 )
{
alert("월이 잘못 되었습니다.(예 : 01 ~ 12)");
obj.value ="";
obj.focus();
return false;
}
return true;
}
//텍스트 입력시 자동으로 - 입력되는 함수
function dashDate(obj) {
/*
if(obj.value.length == 4){
obj.value = obj.value +"-";
}else if(obj.value.length == 7){
obj.value = obj.value +"-";
}
*/
// if ((event.keyCode != 8)&&(event.keyCode != 9)&&(event.keyCode != 37)&&(event.keyCode != 39)&&(event.keyCode != 46)) {
// if ( (event.keyCode < 48)||(event.keyCode > 57 && event.keyCode < 96)||(event.keyCode > 105)||(event.keyCode == 229)) {
// event.returnValue = false;
// }
var val = obj.value.replaceAll("-","");
// length == 10 인 경우 아래 로직을 타면 onChange이벤트가 발생하지 않음
if (obj.value.length == 10) return;
if (val.length > 6) {
val = val.substring(0,4) + "-" + val.substring(4,6) + "-" + val.substring(6);
} else if (val.length > 4) {
val = val.substring(0,4) + "-" + val.substring(4);
}
obj.value = val;
// if(obj.value.length == 4){
// obj.value = obj.value +"-";
// }else if(obj.value.length == 7){
// obj.value = obj.value +"-";
// }
// } else {
// event.returnValue = true;
// }
}
//텍스트 입력시 자동으로 - 입력되는 함수
function dashDateYM(obj) {
if ((event.keyCode != 8)&&(event.keyCode != 9)&&(event.keyCode != 37)&&(event.keyCode != 39)&&(event.keyCode != 46)) {
if ( (event.keyCode < 48)||(event.keyCode > 57 && event.keyCode < 96)||(event.keyCode > 105)||(event.keyCode == 229)) {
event.returnValue = false;
}
if(obj.value.length == 4){
obj.value = obj.value +"-";
}
} else {
event.returnValue = true;
}
}
//9999-12-31 형식으로 리턴하는 함수
function dateFormatYM(strDate) {
var date = "";
if(strDate.indexOf("-") > -1) return strDate;
if(strDate != "") {
var year = "";
var month = "";
var day = "";
if(strDate.length == 6){
year = strDate.substring(0, 4);
month = strDate.substring(4, 6);
date = year+"-"+month
}else if(strDate.length == 8){
year = strDate.substring(0, 4);
month = strDate.substring(4, 6);
day = strDate.substring(6, 8);
date = year+"-"+month+"-"+day
}
}
return date;
}
//99991231 형식으로 리턴하는 함수
function dateDashRemoveFormat(strDate) {
if(strDate.length != 10) return strDate;
var year = strDate.substring(0, 4);
var month = strDate.substring(5, 7);
var day = strDate.substring(8, 10);
return year+month+day;
}
function dateYMDashRemoveFormat(strDate) {
if(strDate.length != 7) return strDate;
var year = strDate.substring(0, 4);
var month = strDate.substring(5, 7);
return year+month;
}
//시간 validation check
function checkTime(strTime){
if( strTime.value.length == 0 ) {
return true;
}
if( strTime.value.length != 5 ){
alert("시간을 잘못 입력하였습니다.");
strTime.value="";
strTime.focus();
return false;
}
var isNanValue;
if( strTime.value.length < 3 ) {
isNanValue = strTime.value;
}
if( strTime.value.length == 3 ) {
if(strTime.value.substring(2,3) != ":" ) {
alert("시간을 잘못 입력하였습니다.");
strTime.value = "";
strTime.focus();
return false;
}
isNanValue = strTime.value.substring(0,2);
}
if( strTime.value.length == 4 || strTime.value.length == 5 ) {
isNanValue = strTime.value.substring(0,2)+strTime.value.substring(3,5);
}
if(isNaN(isNanValue) == true ) {
alert("숫자로 입력해 주세요.");
strTime.value = "";
strTime.focus();
return false;
}
if(strTime.value.length == 5){
var hh = strTime.value.substring(0, 2);
var mm = strTime.value.substring(3, 5);
if(hh.substring(0,1) != "0"){
if(parseInt(hh.substring(0,2)) > 24){
alert("24시간 이내를 입력해주세요.");
strTime.value = "";
strTime.focus();
}
}
if(mm.substring(0,1) != "0"){
if(parseInt(mm.substring(0,2)) > 60){
alert("60분 이내를 입력해주세요.");
strTime.value = "";
strTime.focus();
}
}
}
}
//HH:MM 형식으로 ":"를 자동입력하는 함수
function dashTime(strTime) {
if ((event.keyCode != 8)&&(event.keyCode != 9)&&(event.keyCode != 37)&&(event.keyCode != 39)&&(event.keyCode != 46)) {
if ( (event.keyCode < 48)||(event.keyCode > 57 && event.keyCode < 96)||(event.keyCode > 105)||(event.keyCode == 229) ) {
event.returnValue = false;
}
if(strTime.value.length == 2){
strTime.value = strTime.value +":";
}
} else {
event.returnValue = true;
}
}
//원하는 위치에 '-'문자 넣기
function dashInput(obj, position) {
if ((event.keyCode != 8)&&(event.keyCode != 9)&&(event.keyCode != 37)&&(event.keyCode != 39)&&(event.keyCode != 46)) {
if ( (event.keyCode < 48)||(event.keyCode > 57 && event.keyCode < 96)||(event.keyCode > 105)||(event.keyCode == 229)) {
event.returnValue = false;
}
if(obj.value.length == position-1){
obj.value = obj.value +"-";
}
} else {
event.returnValue = true;
}
}
//설명 : 주민번호 체크.
function checkNoRes(obj){
if(obj.value == "") return;
var resNo = obj.value;
preNoRes = resNo.substring(0,resNo.indexOf("-"));
postNoRes = resNo.substring(resNo.indexOf("-")+1, resNo.length);
if (preNoRes.length != 6){
alert("올바른 주민등록번호를 입력해주세요.");
obj.value = "";
obj.focus();
return false;
}
else if (postNoRes.length != 7){
alert("올바른 주민등록번호를 입력해주세요.");
obj.value = "";
obj.focus();
return false;
}
else {
var str_serial1 = preNoRes;
var str_serial2 = postNoRes;
var digit=0
for (var i=0;i<str_serial1.length;i++){
var str_dig=str_serial1.substring(i,i+1);
if (str_dig<'0' || str_dig>'9'){
digit=digit+1
}
}
if ((str_serial1 == '') || ( digit != 0 )){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
var digit1=0
for (var i=0;i<str_serial2.length;i++){
var str_dig1=str_serial2.substring(i,i+1);
if (str_dig1<'0' || str_dig1>'9'){
digit1=digit1+1
}
}
if ((str_serial2 == '') || ( digit1 != 0 )){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
if (str_serial1.substring(2,3) > 1){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
if (str_serial1.substring(4,5) > 3){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
if ((str_serial2.substring(0,1) > 4) || (str_serial2.substring(0,1) == 0)){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
var a1=str_serial1.substring(0,1)
var a2=str_serial1.substring(1,2)
var a3=str_serial1.substring(2,3)
var a4=str_serial1.substring(3,4)
var a5=str_serial1.substring(4,5)
var a6=str_serial1.substring(5,6)
var check_digit=a1*2+a2*3+a3*4+a4*5+a5*6+a6*7
var b1=str_serial2.substring(0,1)
var b2=str_serial2.substring(1,2)
var b3=str_serial2.substring(2,3)
var b4=str_serial2.substring(3,4)
var b5=str_serial2.substring(4,5)
var b6=str_serial2.substring(5,6)
var b7=str_serial2.substring(6,7)
var check_digit=check_digit+b1*8+b2*9+b3*2+b4*3+b5*4+b6*5
check_digit = check_digit%11
check_digit = 11 - check_digit
check_digit = check_digit%10
if (check_digit != b7){
alert('잘못된 주민등록번호입니다.\n\n다시 확인하시고 입력해 주세요.');
obj.value = "";
obj.focus();
return false;
}
}
return true;
}
//YYYYMMDD-1234567 주민번호형식으로 리턴하는 함수
function idFormat(pidStr) {
var idStr = "";
if(pidStr.length == 13) {
var str1 = "";
var str2 = "";
str1 = pidStr.substring(0, 6);
str2 = pidStr.substring(6, 13);
idStr = str1+"-"+str2;
}
return idStr;
}
//숫자만입력
function checkNum(obj){
if ((event.keyCode != 8)&&(event.keyCode != 9)&&(event.keyCode != 37)&&(event.keyCode != 39)&&(event.keyCode != 46)) {
if ( (event.keyCode < 48)||(event.keyCode > 57 && event.keyCode < 96)||(event.keyCode > 105)||(event.keyCode == 229)) {
event.returnValue = false;
}
} else {
event.returnValue = true;
}
}
/* ----------------------------------------------------------------------------
* 특정 날짜에 대해 지정한 값만큼 가감(+-)한 날짜를 반환
*
* 입력 파라미터 -----
* pInterval : "yyyy" 는 연도 가감, "m" 은 월 가감, "d" 는 일 가감
* pAddVal : 가감 하고자 하는 값 (정수형)
* pYyyymmdd : 가감의 기준이 되는 날짜
* pDelimiter : pYyyymmdd 값에 사용된 구분자를 설정 (없으면 "" 입력)
*
* 반환값 ----
* yyyymmdd 또는 함수 입력시 지정된 구분자를 가지는 yyyy?mm?dd 값
*
* 사용예 ---
* 2008-01-01 에 3 일 더하기 ==> addDate("d", 3, "2008-08-01", "-");
* 20080301 에 8 개월 더하기 ==> addDate("m", 8, "20080301", "");
--------------------------------------------------------------------------- */
function addDate(pInterval, pAddVal, pYyyymmdd, pDelimiter)
{
var yyyy;
var mm;
var dd;
var cDate;
var oDate;
var cYear, cMonth, cDay;
if (pDelimiter != "") {
pYyyymmdd = pYyyymmdd.replace(eval("/\\" + pDelimiter + "/g"), "");
}
yyyy = pYyyymmdd.substr(0, 4);
mm = pYyyymmdd.substr(4, 2);
dd = pYyyymmdd.substr(6, 2);
if (pInterval == "yyyy") {
yyyy = (yyyy * 1) + (pAddVal * 1);
} else if (pInterval == "m") {
mm = (mm * 1) + (pAddVal * 1);
} else if (pInterval == "d") {
dd = (dd * 1) + (pAddVal * 1);
}
cDate = new Date(yyyy, mm - 1, dd) // 12월, 31일을 초과하는 입력값에 대해 자동으로 계산된 날짜가 만들어짐.
cYear = cDate.getFullYear();
cMonth = cDate.getMonth() + 1;
cDay = cDate.getDate();
cMonth = cMonth < 10 ? "0" + cMonth : cMonth;
cDay = cDay < 10 ? "0" + cDay : cDay;
if (pDelimiter != "") {
return cYear + pDelimiter + cMonth + pDelimiter + cDay;
} else {
return cYear + cMonth + cDay;
}
}
/* ----------------------------------------------------------------------------
* 입력날짜가 특정기간 내에 속하는지 여부를 확인
*
* 입력 파라미터 -----
* pInputDate : 입력날짜,yyyymmdd 형식
* pStartDate : ~이상인 날짜
* pEndDate : ~이하인 날짜
*
* 반환값 ----
* 속하면 pass, 속하지 않으면 오류 메시지
*
* 사용예 ---
* 20101202 이 20101201 와 20101202 사이에 속하는지 여부 ==> isInDateYn("20101202", "20101201","20101202");
--------------------------------------------------------------------------- */
function isInDateYn(pInputDate, pStartDate, pEndDate)
{
var pInputDate = sDelDate(pInputDate.value);
//시작,끝기간 조건이 존재하고 입력값이 그 기간 안에 포함되는지
if(pStartDate != "" && pEndDate != ""){
if(!(Number(pStartDate)<=Number(pInputDate)<=Number(pEndDate))){
alert("입력값이 "+dateFormat(pStartDate)+"와 "+dateFormat(pStartDate)+" 사이에 포함되어 있어야 합니다.");
return false;
}
}
//시작 조건이 존재하고 입력값이 그 기간 안에 포함되는지
if(pStartDate != "" && pEndDate == ""){
if(!(Number(pStartDate)<=Number(pInputDate))){
alert("입력값이 "+dateFormat(pStartDate)+"이상이어야 합니다.");
return false;
}
}
//끝 조건이 존재하고 입력값이 그 기간 안에 포함되는지
if(pStartDate == "" && pEndDate != ""){
if(!(Number(pInputDate)<=Number(pEndDate))){
alert("입력값이 "+dateFormat(pEndDate)+"이하여야 합니다.");
return false;
}
}
}