日期函数的逻辑错误

Logical mistake with Date function

本文关键字:错误 函数 日期      更新时间:2023-09-26

嗨,所以我一开始想说的是,我知道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.";
}
}

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

我刚刚运行了这段代码

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