2012-11-20 5 views
0

그래서이 함수는 기본적으로 정수의 입력을 받아 오늘 날짜를 기준으로합니다.이 함수는 'n'개월 수로 돌아갑니다. 예를 들어 오늘 날짜는 2012 년 11 월 20 일입니다. 'n'= 1이면 2012 년 10 월 20 일을 반환합니다.지난 달 계산

임씨가 직면하는 문제는 매월 2 월에서 5 월 사이이며 1 년 변수가 1을 감산한다는 것입니다. 예를 들어 n = 6이면 2012 년 5 월 20 일을 반환합니다. 대신 2012 년 5 월 20 일을 반환합니다.

윤년 문제 일 수 있다고 생각했지만 n = 18로 테스트했을 때 2011 년 5 월 20 일 대신 2010 년 5 월 20 일 반환되며 2011 년은 윤년이 아닙니다.

누구나 내가 이것을 피하기 위해 무엇을 할 수 있는지 알고 있습니까?

lastNmonths = function(n) { 
    var date = new Date(); 

    if (n <= 0) 
     console.log([date.getFullYear(), date.getMonth() + 1 , date.getDate()].join('-')); 

    var years = Math.round(n/12); 
    var months = n % 12; 


    if (years > 0) 
     date.setFullYear(date.getFullYear() - years); 

    if (months > 0) { 
     if (months >= date.getMonth()) { 
      date.setFullYear(date.getFullYear()); 
      months = 12 - months; 
      date.setMonth(date.getMonth() + months); 
     } else { 
      date.setMonth(date.getMonth() - months); 
     } 
    } 


    console.log([date.getFullYear(), date.getMonth() + 1, date.getDate()].join('-')); 
}; 
+0

당신은 단순히'setMonth'하고 당신을 위해 연도를 조정합니다 할 수 있어야한다. 'date.setMonth (date.getMonth() - 12)'는 12 개월 전입니다. – Shmiddty

답변

3

당신이 접근하는 것은 불필요하게 복잡하고 필연적으로 오류가 발생하기 쉽습니다. 대신 Date 인스턴스의 내장 된 오버 플로우 컨트롤을 사용 :

var n = 6; 
var d = new Date(); 
d.setMonth(d.getMonth() - n); 
+3

나는 비슷한 것을 올리려고했는데, 대신이 수수께끼를 가지고있다. http://jsfiddle.net/9qtNs/ – Shmiddty

+0

@Shmiddty Nice. – PointedEars

관련 문제