验证给定月份的天数

cll*_*pse 23 javascript

性能对这一个人来说至关重要......这件事需要快速闪电!


您如何验证给定月份的天数?

我的第一个想法是创建一个包含给定月份日期的数组,索引代表月份:

var daysInMonth = [
    31, // January
    28, // February
    31, // March
    etc.
];
Run Code Online (Sandbox Code Playgroud)

然后做一些事情:

function validateDaysInMonth(days, month)
{
    if (days < 1 || days > daysInMonth[month]) throw new Error("Frack!");
}
Run Code Online (Sandbox Code Playgroud)

但是......闰年怎么样?如何实现闰年检查并保持功能运行相对较快?


更新:我希望你们向我们展示一些代码,这些代码可以完成月闰年验证的日期.

这是描述今天使用的逻辑的流程图:

http://visualbasic.about.com/library/graphics/dykleapyr1-1.gif

nic*_*ckf 53

function daysInMonth(m, y) { // m is 0 indexed: 0-11
    switch (m) {
        case 1 :
            return (y % 4 == 0 && y % 100) || y % 400 == 0 ? 29 : 28;
        case 8 : case 3 : case 5 : case 10 :
            return 30;
        default :
            return 31
    }
}

function isValid(d, m, y) {
    return m >= 0 && m < 12 && d > 0 && d <= daysInMonth(m, y);
}
Run Code Online (Sandbox Code Playgroud)

  • 在那里,修复了ya'. (3认同)
  • 2010年,今年?你喜欢,给我发送乐透结果或者什么? (2认同)

Tor*_*gen 14

我一直在使用Date对象(假设它已编译,因此与脚本相比非常快).

诀窍在于,如果为日期部分输入的数字太高,则Date对象将换行到下个月.所以:

var year = 2009;
var month = 1;
var date = 29;

var presumedDate = new Date(year, month, date);

if (presumedDate.getDate() != date)
    WScript.Echo("Invalid date");
else
    WScript.Echo("Valid date");
Run Code Online (Sandbox Code Playgroud)

这将回显"无效日期",因为presumedDate实际上是3月1日.

这使得闰年等所有麻烦都留给了Date对象,我不必担心它.

干净的把戏,嗯?很脏,但那是给你的脚本......

  • 很好的技巧,并且建立和使用像Date类这样的已建立的东西绝对是一个好主意,但是我只做了一些基准测试,这比我提出的方法慢得多(+ 650%)! (2认同)

Red*_*ter 6

这不会像接受的答案那样好.我把它扔在这里因为我认为这是最简单的代码.大多数人不需要优化此功能.

function validateDaysInMonth(year, month, day)
{
    if (day < 1 || day > 31 || (new Date(year, month, day)).getMonth() != month)
        throw new Error("Frack!");
}
Run Code Online (Sandbox Code Playgroud)

它利用了javascript Date构造函数将在超出范围的日期执行日期算术的事实,例如,如果您这样做:

var year = 2001; //not a leap year!
var month = 1 //February
var day = 29; //not a valid date for this year
new Date(year, month, day);
Run Code Online (Sandbox Code Playgroud)

该对象将返回2001年3月1日作为日期.


Moa*_*ini 5

如果月份不是二月,请从数组中获取数字.否则,检查年份是否跳跃返回29,或返回28.是否有问题?


Jua*_*nZe 5

function caldays(m,y)
{
    if (m == 01 || m == 03 || m == 05 || m == 07 || m == 08 || m == 10 || m == 12)
    {
        return 31;              
    }
    else if (m == 04 || m == 06 || m == 09 || m == 11)
    {
        return 30;        
    }
    else
    {    
        if ((y % 4 == 0) || (y % 400 == 0 && y % 100 != 0))
        {    
            return 29;          
        }
        else 
        {
            return 28;              
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

来源:http ://www.dotnetspider.com/resources/20979-Javascript-code-get-number-days-perticuler-month-year.aspx