Jsp 개월수 계산 - Jsp gaewolsu gyesan

어제 오늘 내일

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 밀리초
1분 = 60초
1시간 = 60분
1일 = 24시간

이므로 

경과 일수는 '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당~얼쑤가 아니네]