我试图在一个月前从特定日期找到日期。但面临一个奇怪的问题。
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)
。这怎么可能?
添加:更详细的问题
我不关心格式化。我很惊讶为什么创建一个不同的日期对象,而我正在使用我刚刚在上面打印的相同变量创建日期。
答案 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年。sd
时,您将通过2008年,12年和25年。答案 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)