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月),则为闰年,否则为非闰年.
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)
它比我以前的版本(下面)稍快一点:
ily = function(yr) {return !((yr % 4) || (!(yr % 100) && (yr % 400)));};
Run Code Online (Sandbox Code Playgroud)
与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架构上的比较更快.
正确而快速:
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
| 归档时间: |
|
| 查看次数: |
25347 次 |
| 最近记录: |