Search code examples
javascriptdatesubtraction

JavaScript Date One Month Ago W/ Range Verification


I'm trying to find the date one month ago from a specific date. But facing a strange problem.

var d = new Date(2009, 1, 25);
var dt = d.getDate();
var m = d.getMonth() - 1;  
var y = d.getFullYear();

if(m === 0) { 
    m = 12;
    y -= 1;
}

var numDays = new Date(y, m + 1, 0).getDate();

if(d.getDate() > numDays) {
    dt = 0;
}
console.log(y, m, dt); // 2008 12 25
var sd = new Date(y, m, dt);
console.log(sd.toString()); // Sun Jan 25 2009 00:00:00 GMT+0530 (IST)

While the first console is printing: 2008 12 25 properly, but the second log shows: Sun Jan 25 2009 00:00:00 GMT+0530 (IST). How is this possible?

Addition: More Detailed Question

I'm not concerned about the formatting. I'm surprised why a different date object is created while I'm creating the date with the same variables I'm printing just above.


Solution

  • Javascript date starts from 0. 0 => JAN, 1 => Feb ... 11 => DEC

    In your case. U set month to 12. As a result when u create a date object, 12 exceeds 11(DEC) and javascript increment 1 more month which results in 2009 JAN 25.

     var sd = new Date(2008, 12, 25);// is equal to Date(2009, 0, 25);
    

    Change ur logic a bit as follows:

     var d = new Date(2009, 1, 25);
     var dt = d.getDate();
     var m = d.getMonth() - 1;  
     var y = d.getFullYear();
    
     if(m === 0) { 
         m = 11;
         y -= 1;
     }
    
     var numDays = new Date(y, m + 1, 0).getDate();
    
     if(d.getDate() > numDays) {
         dt = 0;
     }
     console.log(y, m, dt); // 2008 12 25
     var sd = new Date(y, m, dt);
     console.log(sd.toString());