Date函数的逻辑错误

时间:2014-03-31 17:50:41

标签: javascript date

嗨所以我想在开始时说我知道setMonth()的语法是从0到11.所以我想做的是我有一个下拉菜单。在那里你可以选择11月到12月之间,并选择其中一个月的一天。如果选择的日期是在圣诞节前的4个星期日或之后,它应该根据我目睹的星期日数点燃蜡烛。 (来临花圈)。

我的问题如果我在下拉菜单中选择了11月,我的日期对象仍然在12月,我不知道为什么。这是代码:

function adventCalculate() {

for(i=1;i<=4;i++) { //Resets the Output field
    document.getElementById("f"+i).style.visibility='hidden';
    document.getElementById("txtf"+i).innerHTML="";
}

var a = document.getElementById("mm");
var month = a.options[a.selectedIndex].value;
//Gets the value of the drop down field
var b = document.getElementById("dd");
var day = b.options[b.selectedIndex].value;

var advent = new Date();

advent.setMonth(month-1); //advent.setMonth is always 11, even if i put 10 in the parameter manually

advent.setDate(day);

var xmas = new Date();

xmas.setDate(24);
xmas.setMonth(11);
var adventSonntagDate = new Array(4);
var adventSonntagMonth = new Array(4);
var adventSonntagAusgabe = new Array(4);

var december = 24;

//this checks how many advent sundays ive witnessed

for(i=4;i>=1;) {

    xmas.setDate(december);
    var whatDay = xmas.getDay();

    if(whatDay==0) {
        adventSonntagDate[i-1] = xmas.getDate();
        adventSonntagMonth[i-1] = xmas.getMonth();
        adventSonntagAusgabe[i-1] = "The "+i+". Advent was at "+xmas.getDate()+"."+(xmas.getMonth()+1+".");
        i--;
    }
    if(december>0) {
        december--;
    } else {
        xmas.setMonth(10);
        december = 30;
    }

}
var adventDate;
var aktDate;

//This lets the images of the candle appear. i add 30 so that my script can compare
//30.November to 1.December. My script adds 30 to all december days so 30<31.
// But because of the bug with the date function my site cant distinguish between
//November and December
for(k=0;k<adventSonntagDate.length;k++) {

    if(adventSonntagMonth[k]==10) {
        adventDate = adventSonntagDate[k];
    } else if(adventSonntagMonth[k]==11) {
        adventDate = adventSonntagDate[k] + 30;
    }
    console.log("Der eingegeben Monat ist "+advent.getMonth());
    if(advent.getMonth()==10) {
        aktDate = advent.getDate();
    }else if(advent.getMonth()==11) {
        aktDate = advent.getDate() + 30;
    }

    console.log(adventSonntagDate[k]+" = AdventSonntagDate");
    console.log(adventDate+" = adventDate");
    console.log(advent.getDate()+" = Advent.getDate()");
    console.log(aktDate+" = Help2");
    console.log("---");

    if(adventDate<=aktDate) {
        document.getElementById("f"+(k+1)).style.visibility='visible';
        document.getElementById("txtf"+(k+1)).innerHTML=adventSonntagAusgabe[k];
    }

}

var eve = 30 + 24;//Nov + Dec Xmas
var eve2 = eve - aktDate;
if(eve2>-1) {
document.getElementById("txtf5").innerHTML=+eve2+" days left until christmas."
}else {
    document.getElementById("txtf5").innerHTML="Christmas already passed.";
}

}

感谢您对我的长代码的耐心,并原谅我的语法错误而不是我的母语。

1 个答案:

答案 0 :(得分:0)

我刚刚运行了这段代码

var advent = new Date();
advent.setMonth(10);
alert(advent.getMonth());

并提醒11

为什么?

因为今天是本月的第31个月。明天再次运行,它不会这样做。

您创建今天的日期(3月31日),并将月份更改为11月。但当然,11月31日不存在。当您为JavaScript Date对象提供无效值时,日期会“向前滚动”。因此,在致电setMonth后,您的约会advent实际上包含了12月1日的日期。

我建议一次创建日期,因此advent永远不会有无效的中间日期:

var advent = new Date(new Date().getYear(), month - 1, day);