어제 오늘 내일IT/Javascript [Javascript] 두 날짜 사이 일수 계산하기 (경과 일수)hi.anna 2020. 7. 28. 02:31
Javascript에서 시간을 표현하고, 시간을 다루는 여러가지 방법을 알아보고 있습니다. [HTML] 날짜 입력 항목에 현재 시간을 기본값으로 세팅하기 [Javascript] 현재 날짜, 시간 구하기 [Javascript] Date 객체로 원하는 날짜, 시간 표현하기 [Javascript] 날짜 계산하기 (년/월/일 더하기, 빼기) [Javascript] 월의 마지막 날짜 계산하기 [Javascript] 날짜 계산 (Date) 마지막 날짜(말일)/윤달/윤년 처리하기 [Javascript] 시간 계산하기 (시/분/초/ 더하기, 빼기) 지난 번에는 경과 시간을 계산하는 방법을 알아보았습니다. [Javascript] 경과 시간 계산하기 (시간, 분, 초) 이번에는 Javascript에서 주어진 두 날짜 사이의 경과 일수를 계산하는 방법을 알아보도록 하겠습니다. 두 날짜 사이 일수 계산하기 (경과 일수)경과 일수를 구하는 방법은 지난 포스팅에서 알아본 경과 시간/분/초를 계산하는 방법과 다르지 않습니다. See the Pen Date by anna (@hianna) on CodePen. Date의 getTime() 메소드는 '1970년 1월1 일 00:00:00 UTC'로부터 주어진 시간 사이의 경과시간(밀리초)를 리턴합니다. 즉, '1970년 1월1 일 00:00:00 UTC'의 getTime() 값은 0입니다. 그리고, '1970년 1월 1일 00:00:01 UTC'의 getTime() 값은 1000입니다. const elapsedDay = elapsedMSec / 1000 / 60 / 60 / 24; 이를 이용해서 경과 일수를 계산 할 수 있는데, 종료일자.getTime() - 시작일자.getTime()을 계산하면 두 날짜 사이의 '경과 밀리초'를 얻을 수 있게 됩니다. 1초 = 1000 밀리초 이므로 경과 일수는 'elapsedMSec / 1000 / 60 / 60 / 24' 의 식으로 계산해 낼 수 있습니다. 윤년을 포함하여 개월수 정확하게 계산 아래 소스를 모두 복사후 시작날짜 와 끝나는 날짜를 YYYYMMDD 방식으로 던져주면된다. 함수 리턴은 재귀함수를 이용하므로 꼭 필요하다. http://som2day.com/138 소스 /** * @ author : [insom*nia] () * Homepage(BloG): http://som2day.com/ * @ date : 2010-01-06 * @ descript : JavaScripts Date Functions */ function isLeapYear(year) { // parameter가 숫자가 아니면 false if (isNaN(year)) return false; else { var nYear = eval(year); // 4로 나누어지고 100으로 나누어지지 않으며 400으로는 나눠지면 true(윤년) if (nYear % 4 == 0 && nYear % 100 != 0 || nYear % 400 == 0) return true; else return false; } } // start, end format: yyyymmdd function getDifMonths(start, end) { var startYear = start.substring(0, 4); var endYear = end.substring(0, 4); var startMonth = start.substring(4, 6) - 1; var endMonth = end.substring(4, 6) - 1; var startDay = start.substring(6, 8); var endDay = end.substring(6, 8); // 연도 차이가 나는 경우 if (eval(startYear) > eval(endYear)) { // 종료일 월이 시작일 월보다 수치로 빠른 경우 if (eval(startMonth) > eval(endMonth)) { var newEnd = startYear + "1231"; var newStart = endYear + "0101"; return (eval(getDifMonths(start, newEnd)) + eval(getDifMonths(newStart, end))).toFixed(2); // 종료일 월이 시작일 월보다 수치로 같거나 늦은 경우 } else { var formMonth = eval(startMonth) + 1; if (eval(formMonth) < 10) formMonth = "0" + formMonth; var newStart = endYear + "" + formMonth + "" + startDay; var addMonths = (eval(endYear) - eval(startYear)) * 12; return (eval(addMonths) + eval(getDifMonths(newStart, end))).toFixed(2); } } else { // 월별 일수차 (30일 기준 차이 일수) var difDaysOnMonth = new Array(1, -2, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1); var difDaysTotal = getDifDays(start, end); for (i = startMonth; i < endMonth; i++) { if (i == 1 && isLeapYear(startYear)) difDaysTotal -= (difDaysOnMonth[i] + 1); else difDaysTotal -= difDaysOnMonth[i]; } // because view this function window.alert("- run getDifMonths()\n- " + start + " ~ " + end + " => " + (difDaysTotal / 30).toFixed(2)); return (difDaysTotal / 30).toFixed(2); } } // start, end format: yyyymmdd function getDifDays(start, end) { var dateStart = new Date(start.substring(0, 4), start.substring(4, 6) - 1, start.substring(6, 8)); var dateEnd = new Date(end.substring(0, 4), end.substring(4, 6) - 1, end.substring(6, 8)); var difDays = (dateEnd.getTime() - dateStart.getTime()) / (24 * 60 * 60 * 1000); // because view this function window.alert("- run getDifDays()\n- " + start + " ~ " + end + " => " + Math.ceil(difDays)); return Math.ceil(difDays); } --------------------------------------------------------------------------------------------- 다른버전 function getDiffDays(pStartDate, pEndDate, pType){ //param : pStartDate - 시작일 //param : pEndDate - 마지막일 //param : pType - 'D':일수, 'M':개월수 var strSDT = new Date(pStartDate.substring(0,4),pStartDate.substring(4,6)-1,pStartDate.substring(6,8)); var strEDT = new Date(pEndDate.substring(0,4),pEndDate.substring(4,6)-1,pEndDate.substring(6,8)); var strGapDT = 0; if(pType == 'D') { //일수 차이 strGapDT = (strEDT.getTime()-strSDT.getTime())/(1000*60*60*24); } else { //개월수 차이 //년도가 같으면 단순히 월을 마이너스 한다. if(pEndDate.substring(0,4) == pStartDate.substring(0,4)) { strGapDT = pEndDate.substring(4,6) * 1 - pStartDate.substring(4,6) * 1; } else { strGapDT = ((strEDT.getTime()-strSDT.getTime())/(1000*60*60*24*365.25/12)).toFixed(2); } } return strGapDT; } ---------------------------------------------------------------------------------------- function getPrevDateValidate(yyyymmdd, term){ var yyyy = yyyymmdd.substring(0, 4); var mm = yyyymmdd.substring(4, 6); var dd = yyyymmdd.substring(6, 8); myDate = new Date(); myDate.setFullYear(yyyy); myDate.setMonth(mm-1); myDate.setDate(dd); if(term.charAt(term.length-1) == 'd'){ term = term.substring(0, term.length-1); myDate.setDate(dd - eval(term) +1 ); } if(term.charAt(term.length-1) == 'm'){ term = parseInt(term.substring(0, term.length-1), 10); myDate.setMonth(mm - eval(term) -1); myDate.setDate(myDate.getDate()+1); } yyyy = myDate.getYear(); mm = myDate.getMonth()+1; dd = myDate.getDate(); dd = (dd<10)?'0'+dd:dd; mm = (mm<10)?'0'+mm:mm; return yyyy+'-'+mm+'-'+dd; } function IsValidCheckDate(from_date, to_date, astr){ if(astr != ""){ to_date = ClearDelimit(to_date, "-"); var temp_day = getPrevDateValidate(to_date, astr); temp_day = ClearDelimit(temp_day, "-"); from_date = ClearDelimit(from_date, "-"); if(astr.indexOf("m") != -1){ var tempstring = astr.split("m"); var tempchar = "개월"; } if(astr.indexOf("d") != -1){ var tempstring = astr.split("d"); var tempchar = "일"; } if(parseInt(from_date,10) < parseInt(temp_day,10)){ alert("조회단위가 초과되었습니다. 본 서비스는 "+tempstring[0]+ tempchar +" 단위로만 조회가 가능합니다."); return true; } } } function ClearDelimit(str,serchar){ var reStr =""; var seStr =""; var i = 0; seStr=str; reStr=''; for (i=0;i <seStr.length; i++){ reStr += (seStr.charAt(i) != serchar ?seStr.charAt(i) : ''); } return reStr; } 출처: http://algina.tistory.com/68 [IT당~얼쑤가 아니네] |