javascript找到闰年

Jua*_*nte 21 javascript date textfield leap-year

如果我有一个月的2月,我怎样才能让下面的代码工作?目前它已经到了那天,然后在到达if之前停下来确定它是否是闰年.

 if (month == 2) {
    if (day == 29) {
        if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) {
            field.focus();
             field.value = month +'/' +  '';
        }
    }
    else if (day > 28) {
        field.focus();
             field.value = month +'/' +  '';
    }
}
Run Code Online (Sandbox Code Playgroud)

geo*_*org 108

Date对象用于日期时间的东西更安全,例如

isLeap = new Date(year, 1, 29).getMonth() == 1
Run Code Online (Sandbox Code Playgroud)

由于人们不断询问这是如何工作的,因此它与JS如何计算年 - 月 - 日的日期值有关(详情请参见此处).基本上,它首先计算该月的第一天,然后为其添加N-1天.因此,当我们在非闰年要求2月29日时,结果将是2月1日+ 28天= 3月1日:

> new Date(2015, 1, 29)
< Sun Mar 01 2015 00:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)

在闰年,2月28日= 2月29日:

> new Date(2016, 1, 29)
< Mon Feb 29 2016 00:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我将日期设置为2月29日,看看是否发生了翻转.如果不是(月份仍为1,即2月),则为闰年,否则为非闰年.

  • 天啊.什么是黑客.`:)` (15认同)
  • 仅用于低音量场景,因为这比使用`isLeap =!((yr%4)||(!(yr%100)&&(yr%400)))的速度慢约100倍;`http:// jsperf.com/ily/7 (8认同)

Gon*_*ing 15

与使用相比,new Date()这是快约100倍!

更新:

这个最新版本使用了底部3位的位测试(它是4的倍数),以及检查年份是16的倍数(二进制中的底部4位是15)并且是25的倍数.

ily = function(y) {return !(y & 3 || !(y % 25) && y & 15);};
Run Code Online (Sandbox Code Playgroud)

http://jsperf.com/ily/15

它比我以前的版本(下面)稍快一点:

ily = function(yr) {return !((yr % 4) || (!(yr % 100) && (yr % 400)));};
Run Code Online (Sandbox Code Playgroud)

http://jsperf.com/ily/7

与broc.seib已经很快的条件运算符版本相比,它也快了5%

速度测试结果:http://jsperf.com/ily/6

预期的逻辑测试结果:

alert(ily(1900)); // false
alert(ily(2000)); // true
alert(ily(2001)); // false
alert(ily(2002)); // false
alert(ily(2003)); // false
alert(ily(2004)); // true
alert(ily(2100)); // false
alert(ily(2400)); // true
Run Code Online (Sandbox Code Playgroud)


小智 6

isLeap = !(new Date(year, 1, 29).getMonth()-1)
Run Code Online (Sandbox Code Playgroud)

...减去一个应该比大多数CPU架构上的比较更快.


bro*_*eib 6

正确而快速:

ily = function(yr) { return (yr%400)?((yr%100)?((yr%4)?false:true):false):true; }
Run Code Online (Sandbox Code Playgroud)

如果你处于循环中或计算纳秒数,这比通过新的Date()对象运行你的年份快两个数量级.比较这里的表现:http://jsperf.com/ily

  • 因为这只是将布尔比较与布尔结果相结合,所以你可以在没有条件运算符的情况下表达这一点,而只需要&&的,||和短路.也快5%左右:http://jsperf.com/ily/6 (2认同)