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();
원래 내가 말한 것이기 때문입니다.
… 이는 두 달 사이에 몇 개월이 몇 달인 지를 알아 내며 , 부분 달은 계산하지 않습니다 (예 : 각 날짜가있는 달 제외).
두 가지 이유로 제거했습니다.
-
부분 개월을 세지 않으면 대답에 오는 많은 (대부분의) 사람들이 아닌 것으로 판명되었으므로 분리해야한다고 생각했습니다.
-
그 정의조차도 항상 작동하지는 않았습니다. 😀 (죄송합니다.)
답변
월의 날짜를 고려하지 않으면 훨씬 간단한 솔루션입니다.
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 개월의 차이를 가져옵니다. roundUpFractionalMonths
param을로 설정하면이를 방지 할 수 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;
}