带有日期功能的逻辑错误 [英] Logical mistake with Date function

查看:147
本文介绍了带有日期功能的逻辑错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Hi so what i want to say at the beginning i know that the syntax for setMonth() is from 0 - 11. So what i want to do is i have a drop down menu. there you can choose between november and december and pick a day in one of those months. if the picked date is while or after 4 sundays before christmas it should light candles based on the numbers of sundays i have witnessed. (advent wreath).

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

My Problem if i pick november in my drop down menu my date object is still in december and i dont know why. Here is the code:

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.";
}

}

感谢您的耐心与我的长我的语法错误不是我的母语。

Thanks for your patience with my long code and excuse my grammar mistakes not my mother tongue.

推荐答案

我刚刚运行这段代码

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

,并提醒 11

为什么?

因为今天是本月31日。明天再运行,不会这样做。

Because today is the 31st of the month. Run it again tomorrow and it won't do this.

您创建今天的日期(3月31日),并将该月份更改为11月。但当然,11月31日不存在。当您向JavaScript Date 对象提供无效值时,日期将被滚动转发。所以在调用 setMonth 之后,你的日期 advent 实际上包含12月1日的日期。

You create today's date (31st March), and change the month to November. But of course, 31st November does not exist. When you give invalid values to the JavaScript Date object, the date gets 'rolled' forwards. So after calling setMonth your date advent actually contains the date 1st December.

我建议一次创建日期,所以 advent 从来没有一个无效的中间日期被卷入前进:

I would recommend creating the date in one go, so advent never has an invalid intermediate date that gets rolled forward:

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

这篇关于带有日期功能的逻辑错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆