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

时间:2016-12-12 09:27:03

标签: 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() > 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)。这怎么可能?

添加:更详细的问题

我不关心格式化。我很惊讶为什么创建一个不同的日期对象,而我正在使用我刚刚在上面打印的相同变量创建日期。

5 个答案:

答案 0 :(得分:4)

Javascript日期从0开始。 0 => JAN,1 => 2月... 11 => DEC

在你的情况下。 U将月份设置为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());    

答案 1 :(得分:1)

JavaScript从0到11计算月份.1月是0. 12月是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

答案 2 :(得分:0)

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

  • 您的IF声明为真,那么月(m)就会变为12和年 是减一。
  • 现年(y)是2008年。
  • 在创建新的Date对象sd时,您将通过2008年,12年和25年。
  • 由于月份从0开始计算,因此月份为12(全年 额外和月份是0),所以你再过一年了 这一点。

答案 3 :(得分:0)

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

答案 4 :(得分:-4)

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

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

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