[javascript] JavaScript에서 두 날짜의 월 차이

JavaScript에서 두 Date () 객체의 차이를 어떻게 해결하고 차이의 개월 수 만 반환합니까?

어떤 도움이라도 좋을 것입니다 🙂



답변

“차이의 개월 수”에 대한 정의는 많은 해석이 필요합니다. 🙂

JavaScript 날짜 객체에서 년, 월 및 일을 얻을 수 있습니다. 찾고있는 정보에 따라 두 시점 사이에 몇 개월이 있는지 파악할 수 있습니다.

예를 들어, 커프 외 :

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

JavaScript의 월 값은 0 = 1 월로 시작합니다.

전형적인 2 월의 3 일은 8 월의 3 일 (~ 9.677 %)보다 3 월 (~ 10.714 %)의 큰 비율이며, 물론 2 월도 움직이는 목표이기 때문에 위의 분수를 포함하는 것은 훨씬 더 복잡합니다. 윤년인지에 따라.

JavaScript에 사용할 수있는 일부 날짜 및 시간 라이브러리 도 있으므로 이러한 종류의 작업을 쉽게 수행 할 수 있습니다.


참고 : + 1위의 예는 다음과 같습니다.

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

원래 내가 말한 것이기 때문입니다.

… 이는 두 사이에 몇 개월이 몇 달인 지를 알아 내며 , 부분 달은 계산하지 않습니다 (예 : 각 날짜가있는 달 제외).

두 가지 이유로 제거했습니다.

  1. 부분 개월을 세지 않으면 대답에 오는 많은 (대부분의) 사람들이 아닌 것으로 판명되었으므로 분리해야한다고 생각했습니다.

  2. 그 정의조차도 항상 작동하지는 않았습니다. 😀 (죄송합니다.)


답변

월의 날짜를 고려하지 않으면 훨씬 간단한 솔루션입니다.

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() +
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1

월 인덱스는 0부터 시작합니다. 이것은 January = 0및을 의미합니다 December = 11.


답변

때로는 하루 부분을 완전히 무시하고 두 날짜 사이의 월 수량 만 가져오고 싶을 수도 있습니다. 예를 들어 2013/06/21 및 2013/10/18의 두 날짜가 있고 2013/06 및 2013/10 부분에만 관심이있는 경우 시나리오 및 가능한 솔루션은 다음과 같습니다.

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1. month1과 month2를 제외한 두 날짜 사이의 월 수만 원하는 경우

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2. 달 중 하나를 포함하려면

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3. 두 달을 모두 포함하려면

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;


답변

다음은 두 날짜 사이의 월 수를 정확하게 제공하는 함수입니다.
기본 동작은 전체 개월 만 계산합니다. 예를 들어 3 개월과 1 일은 3 개월의 차이를 가져옵니다. roundUpFractionalMonthsparam을로 설정하면이를 방지 할 수 true있으므로 3 개월과 1 일 차이는 4 개월로 반환됩니다.

위의 허용 된 답변 (TJ Crowder ‘s answer)은 정확하지 않으며 때로는 잘못된 값을 반환합니다.

예를 들어, 분명히 잘못된 것을 monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))반환합니다 0. 정확한 차이는 1 개월 또는 2 개월입니다.

내가 쓴 기능은 다음과 같습니다.

function getMonthsBetween(date1,date2,roundUpFractionalMonths)
{
    //Months will be calculated between start and end dates.
    //Make sure start date is less than end date.
    //But remember if the difference should be negative.
    var startDate=date1;
    var endDate=date2;
    var inverse=false;
    if(date1>date2)
    {
        startDate=date2;
        endDate=date1;
        inverse=true;
    }

    //Calculate the differences between the start and end dates
    var yearsDifference=endDate.getFullYear()-startDate.getFullYear();
    var monthsDifference=endDate.getMonth()-startDate.getMonth();
    var daysDifference=endDate.getDate()-startDate.getDate();

    var monthCorrection=0;
    //If roundUpFractionalMonths is true, check if an extra month needs to be added from rounding up.
    //The difference is done by ceiling (round up), e.g. 3 months and 1 day will be 4 months.
    if(roundUpFractionalMonths===true && daysDifference>0)
    {
        monthCorrection=1;
    }
    //If the day difference between the 2 months is negative, the last month is not a whole month.
    else if(roundUpFractionalMonths!==true && daysDifference<0)
    {
        monthCorrection=-1;
    }

    return (inverse?-1:1)*(yearsDifference*12+monthsDifference+monthCorrection);
};


답변

28, 29, 30 또는 31 일인 달에 관계없이 전체 월을 계산해야하는 경우 아래가 작동합니다.

var months = to.getMonth() - from.getMonth()
    + (12 * (to.getFullYear() - from.getFullYear()));

if(to.getDate() < from.getDate()){
    months--;
}
return months;

이것은 답변의 확장 버전입니다 https : //.com/a/4312956/1987208 이지만 1 월 31 일에서 2 월 1 일 (1 일)까지 1 개월로 계산되는 경우를 수정합니다.

이것은 다음을 다룰 것이다;

  • 1 월 1 일 ~ 1 월 31 일 —> 30 일 —>은 0이됩니다 (1 개월이 아니기 때문에 논리적 임).
  • 2 월 1 일 ~ 3 월 1 일 —> 28 또는 29 일 —> 1 (결과는 1 개월이므로 논리)
  • 2 월 15 일 ~ 3 월 15 일 —> 28 또는 29 일 —> 1 (결과는 한 달이 지났으므로 논리)
  • 1 월 31 일 ~ 2 월 1 일 —> 1 일 —> 결과는 0입니다 (분명하지만 1 개월 후 게시물에 언급 된 답변).

답변

JavaScript에서 두 날짜의 월 차이 :

 start_date = new Date(year, month, day); //Create start date object by passing appropiate argument
 end_date = new Date(new Date(year, month, day)

start_date와 end_date 사이의 총 개월 :

 total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth())


답변

나는 이것이 정말로 늦다는 것을 알고 있지만 어쨌든 다른 사람들을 돕기 위해 게시하는 것입니다. 다음은 두 날짜 사이의 월 차이를 계산하는 데 도움이되는 기능입니다. 그것은 Mr.Crowder ‘s에 비해 상당히 야만적이지만 날짜 개체를 단계별로 수행하여보다 정확한 결과를 제공합니다. 그것은 AS3에 있지만 강력한 타이핑을 버릴 수 있어야하며 JS가 있습니다. 누군가를 더 멋지게 바라 보게 해주세요!

    function countMonths ( startDate:Date, endDate:Date ):int
    {
        var stepDate:Date = new Date;
        stepDate.time = startDate.time;
        var monthCount:int;

        while( stepDate.time <= endDate.time ) {
            stepDate.month += 1;
            monthCount += 1;
        }

        if ( stepDate != endDate ) {
            monthCount -= 1;
        }

        return monthCount;
    }