JavaScript 一个月前的日期/范围验证

JavaScript Date One Month Ago W/ Range Verification

我正在尝试从特定日期查找一个月前的日期。但是遇到一个奇怪的问题。

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)

虽然第一个控制台正确打印:2008 12 25,但第二个日志显示:Sun Jan 25 2009 00:00:00 GMT+0530 (IST)。这怎么可能?

补充:更详细的问题

我不关心格式。我很惊讶为什么在我使用上面打印的相同变量创建日期时创建了不同的日期对象。

当您在控制台中打印年月日时,它会打印为 2008 12 25 因为这些值是从 Date 对象中提取的。 然后创建一个新对象 "sd",它是一个 Date 对象。

var sd = new Date(y, m, dt);

因此它将打印日期对象 toString() 方法并将日期打印为 Sun Jan 25 2009 00:00:00 GMT+0530 (IST)

JavaScript 从 0 到 11 计算月份。一月是 0。十二月是 11。

给日期加个mounth的最好方法就是这样

var d = new Date(2009, 1, 25); //Wed Feb 25 2009 00:00:00 GMT+0100
d.setMonth(d.getMonth()+1); //Wed Mar 25 2009 00:00:00 GMT+0100

Javascript日期从0开始。 0 => 一月,1 => 二月 ... 11 => 十二月

在你的情况下。您将月份设置为 12。因此,当您创建日期对象时,12 超过 11(DEC) 并且 javascript 增加 1 个月,结果为 2009 年 1 月 25 日。

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

按如下方式稍微更改您的逻辑:

 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());    

它显示不同的结果,因为你是那样做的。

  • 您的 IF 陈述是正确的,因此月份 (m) 变为 12 和年份 是负一。
  • 现在年份 (y) 是 2008 年。
  • 当您创建新的日期对象 sd 时,您将传递 2008、12 和 25。
  • 因为月份是从0开始算的,所以取的月份是12(是整年 extra 和 month 是 0th),所以你又过了一年 那。

正如 AdditionMonster 所说。 顺便说一句,您可以使用 setMonth();

函数改进代码

像这样:

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

  var d2 = new Date(y,m,dt);
  d2.setMonth(d.getMonth() - 2);
  console.log(d2);