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

JavaScript一个月前的日期,带范围验证,javascript,date,subtraction,Javascript,Date,Subtraction,我想从一个特定的日期中找出一个月前的日期。但是面对一个奇怪的问题 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() >

我想从一个特定的日期中找出一个月前的日期。但是面对一个奇怪的问题

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)
。这怎么可能

添加:更详细的问题


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

当您在控制台中打印年、月和日期时,它将打印为20081225,因为这些值是从日期对象提取的。 然后创建一个新对象,即日期对象

var sd=新日期(y、m、dt)


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

JavaScript从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月,1=>2月。。。11=>12月

就你而言。你把月份定为12。因此,当你创建一个date对象时,12超过11(12月),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());    

它显示不同的结果,因为是您这样做的。

  • 如果
    语句为真,则月份(
    m
    )变为12和年份 是负一
  • 现在(
    y
    )是2008年
  • 当您创建新的日期对象时,您将通过2008、12和25
  • 由于从0开始计算月数,则取的月数为12(其全年) “额外”和“月份”是0),因此您将像这样再多过一年 那个
正如AdditionMonster所说。 顺便说一下,您可以使用函数()改进代码

像这样:

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

我的问题不是关于格式。我关心的是,为什么它打印的日期不同于从变量创建的日期您在这里使用不同的“参数”打印-
console.log(y,m,dt)
vs
console.log(sd.toString()),因此您将获得不同的输出。第二种是使用本机
.toString()