我正在编写一个JavaScript程序,它接收用户输入的日期,并确定给定日期的星期几。我可以让程序参加日期。我使用调试语句来打印日,月,年和世纪的值,以确保程序正确获取值,这是迄今为止的。
我还有一个名为totalNumDays
的调试变量,它存储自该值不同以来每个月的天数。 (1月有31天,4月有30天,2月有28天或29天)。我遇到的问题是让2月份的数字正确无误。
我所做的是创建一个包含31天所有月份的数组:
//1 = January, 3 = March, 5 = May,..., etc.
var monthNumsWith31 = [1, 3, 5, 7, 8, 10, 12];
然后我会使用for循环来迭代以确定天数。我在这里试了几个不同的东西。我认为最有意义的是:
for(var i = 0; i < monthNumsWith31.length; i++)
{
if(month == monthNumsWith31[i])
{
totalNumDays = 31;
}
else
{
if(month == 2 && isLeapYear() == true)
{
totalNumDays = 29;
}
else if(month == 2 && isLeapYear() == false)
{
totalNumDays = 28;
}
else
{
totalNumDays = 30;
}
}
我尝试了很多不同的东西,似乎无法将它存储到二月的正确天数。我甚至尝试创建第二个monthNumsWith30
数组,并使用两个不同的for循环来迭代这两个数组,并设置30天和31天的适当天数。我认为问题可能出在我的isLeapYear()
函数中。以下是isLeapYear()
的代码。请注意year
是全局的,因此该函数可以访问它。
function isLeapYear() {
if(year % 4 == 0)
{
if(year % 100 == 0)
{
if(year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
else
{
return false;
}
}
我试图按照公式来确定一年是否是闰年。公式可以看作:https://gyazo.com/9e4b7fb92014d1e27315807c188fd5e0
有谁知道为什么我的功能没有做它应该做的事情?感谢。
更新 我现在正确地工作,以确定每个月的正确天数。然而,我有另一个问题。
为了找出给定日期的星期几,我正在使用Zeller的同余。我使用的具体公式是((26M - 2) / 10 + D + Y + Y/4 + C/4 + 5C) MOD 7
,其中M
,D
,Y
正是它们看起来的那样,C
是世纪(前两位数字)年)。算法的一部分陈述
IF Month < 3 THEN
Year = Year - 1
Month = Month + 10
ELSE
Month = Month - 2
END IF
我把所有这些工作看似正确。我输入了许多调试语句以确保它获得正确的值,但由于某种原因,计算机正在错误地评估表达式。
此算法将给出0到6之间的数字.0表示星期日,1表示星期一等。例如,采取日期2/15/16。这个日期发生在星期一。 2016年2月15日,星期一。
在我的程序中,我有以下代码
var weekdayIndex = (Math.floor((26 * monthVal) - 2 / 10) + dayVal +
yearVal + Math.floor(yearVal / 4) + Math.floor(centuryVal / 4) +
(5 * centuryVal)) % 7;
当此表达式运行时,它应该等于1
,但由于某种原因它等于0
。我手工完成了数学计算,一遍又一遍地评估每个表达式,并不断得到1
。手动执行此操作我得到的数字为(31 + 15 + 15 + 3 + 5 + 20) % 7
。当我将这个表达式直接放入计算机(没有所有变量名和Math.floor表达式,只是数字)时,它正确地获取了值。当我使用变量名和表达式时,我不知道为什么它是不正确的。有什么想法吗?
答案 0 :(得分:2)
你的功能还可以,除了一件简单的事情:你缺少年份参数!
function isLeapYear(year) {
return year % 4 == 0 &&
(year % 100 !== 0 || year % 400 === 0);
}
但是,扩展语法也可以:
function isLeapYear(year) {
if(year % 4 == 0)
{
if(year % 100 == 0)
{
if(year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
else
{
return false;
}
}
isLeapYear(1900)
按预期收取false
,2000 true
,1996 true
,1997 false
。
似乎对我来说是合法的。
答案 1 :(得分:1)
我认为你的逻辑很可疑。我使用以下函数来确定给定年份是否为闰年:
CsiLgrDate.leap_year = function (year)
{ return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); };
答案 2 :(得分:1)
您的功能正确,错误是因为Array
的javascript month
为零索引。
更改此行:
var monthNumsWith31 = [1, 3, 5, 7, 8, 10, 12];
对此:
var monthNumsWith31 = [0, 2, 4, 6, 7, 9, 11];
从所有月份引用中减去一个( 2月是数组索引1 )
您可以在控制台上输入(new Date()).getMonth()
进行测试:您会看到march == 2
。
希望它有所帮助。
答案 3 :(得分:1)
如果在 isLeapYear 调用和函数声明中使用 year 参数,代码实际上有效。
以下是与发布完全相同的代码(好吧,我添加了一个缺失的结束}
,我认为这是一个帖子遗漏):
// Set some test values
var monthNumsWith31 = [1, 3, 5, 7, 8, 10, 12];
var month = 2;
var year = 2000
for(var i = 0; i < monthNumsWith31.length; i++)
{
if(month == monthNumsWith31[i])
{
totalNumDays = 31;
}
else
{
if(month == 2 && isLeapYear(year) == true)
{
totalNumDays = 29;
}
else if(month == 2 && isLeapYear(year) == false)
{
totalNumDays = 28;
}
else
{
totalNumDays = 30;
}
}
}
function isLeapYear(year) {
if(year % 4 == 0)
{
if(year % 100 == 0)
{
if(year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
else
{
return false;
}
}
document.write(totalNumDays);
答案 4 :(得分:0)
Here give this a shot.我假设你刚开始。我们可以避免很多嵌套的if语句。此外,你会想要开始养成使用三等号(===)的习惯,因为它会进行类型检查,并且不会使用“truthy”值做奇怪的事情。
首先,看看你的isLeapYear
功能。当你检查if语句并使用等于运算符来比较它们时,它将返回true或false,所以如果我们没有做奇怪的事情,我们期望true是假的(尽管有简单的方法可以也这样做)我们实际上可以只返回表达式得到true或false,而不是如果表达式为true或false则需要返回true或false。
将年份作为参数传递而不是从父母的范围中获取它也可能是值得的。但在这种情况下,实际上并不重要,我敢肯定。
&&
将检查语句是否为真,然后它将执行下一个表达式。如果你期望一切都是真的,你可以把它链起来,因为如果有一件事是假的,那么一切都是假的。所以不需要编写嵌套的if语句。
function checkLeapYear(yearToCheck) {
return yearToCheck%4 === 0 && yearToCheck%100 === 0 && yearToCheck%400 === 0;
}
因此循环遍历数组有点贵。您可能会了解到,如果您开始遍历数组中的数组。但幸运的是,我们甚至不需要这个例子。
This is a switch statement。如果你有相同的价值你需要的价值,这是非常方便的。但是你可能会听到很多人对我写的方式是错误的并且你永远不应该让案件失败。我不同意那些人,因为我认为这是你想要做的时候的一个很好的例子。
此开关将采用变量,本例中为月份。将其与案例中的值进行比较,然后执行案例的代码。在没有break;
的情况下,它会进入下一个案例。因为我们希望1, 3, 5, 7, 8, 10, 12
为totalNumDays = 31
所有人设置month
我们将其设置为最低的情况并将其余部分归入。
但如果totalNumDays
等于2,我们希望checkLeapYear
在闰年为29,否则为28。三元运算符它基本上像速记if语句一样工作。你给它一个表达式,在这种情况下是?
函数,然后是:
来启动三元运算符。那么它的值是真的,这种情况我们希望它等于29.然后对于假值使用totalNumDays
然后把你想要的假值,在这种情况下是28。
在switch语句中,default表示如果没有匹配则执行此操作。这使totalNumDays
等于30.这可能有点危险,好像我们使月份等于13或'A'仍然会使switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
totalNumDays = 31;
break;
case 2:
totalNumDays = checkLeapYear(year) ? 29 : 28;
break;
default:
totalNumDays = 30;
break;
}
等于30.但是为每种可能性做准备不是我现在太在意了。
scripts/
scripts/folder1/
scripts/folder1/module
scripts/folder1/module/setup.py
scripts/folder1/module/src/module
scripts/folder1/module/src/module/__init__.py
scripts/folder1/module/src/module/source.py
无论如何,我希望这会有所帮助,并且没有太多可以接受。至于为什么你的代码不起作用。我想这可能是因为你的循环从第0个月开始。这将是30个月的月份。