在JavaScript中检查是否为闰年

99
 function leapYear(year){
    var result; 
    year = parseInt(document.getElementById("isYear").value);
    if (years/400){
      result = true
    }
    else if(years/100){
      result = false
    }
    else if(years/4){
      result= true
    }
    else{
      result= false
    }
    return result
 }

这是我目前拥有的(输入是通过表单传入,因此存储在“isYear”中),我基本上遵循了这里的方法,因此在使用我已有的内容的基础上,如何根据以下条件检查输入是否为闰年(请注意,当实现伪代码时可能出错,请纠正我) 编辑:请注意,这需要使用整数而不是日期函数。

1
JavaScript查找闰年。 - swetha
1
问题是我需要将其处理为仅使用年份,比如2014作为整数而不是日期值。 - BigBob
这里有一个非常详细的计算信息 - https://www.mathsisfun.com/leap-years.html - Manohar Reddy Poreddy
7个回答

223
function leapYear(year)
{
  return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}

2
FYI:这似乎比下面的 isLeap 更高效--http://jsfiddle.net/atwright147/7dqzvzpr/ - atwright147
5
历史上最快!!! 可以简化为稍微加速一点。function isLeap (y) { return !((y % 4) || (!(y % 100) && y % 400)); } - fedeghe
2
@fedeghe 我本以为我写的是最简洁的 !(y%4)&&(!(y%400)||!!(y%100)); 直到看到了你的评论,但你使用了相反的逻辑,节省了两个字符!哈哈,做得非常好。 - Modular
1
@fedeghe 你觉得 !(y&3||y&15&&!(y%25)); 怎么样?详情请见 https://dev59.com/i2kw5IYBdhLWcg3wfKrZ! - ReinstateMonica3167040
1
小问题,但大多数情况下使用严格的(不)相等运算符“===”是正确的。 - Neil Meyer
显示剩余9条评论

73
该函数检查二月是否有29天。如果是,则说明是闰年。
ES5
function isLeap(year) {
  return new Date(year, 1, 29).getDate() === 29;
}

ES6

const isLeap = year => new Date(year, 1, 29).getDate() === 29;

结果

isLeap(1004) // true
isLeap(1001) // false

12
我最喜欢这个解决方案,因为它不需要对公历有任何基础知识。 - Matt Korostoff
1
不适用于 00000099 的输入。 - inetphantom
5
你刚才描述的问题有点类似于反向的Y2K。 - Matt Korostoff

9

8
这是更为简洁的表达:!(y&3 || y&15 && !(y%25)) - ReinstateMonica3167040
7
不太易读。 @ReinstateMonica3167040 - elad.chen
2
@elad.chen 同意,我可能是因为对被接受答案的评论而发表了那个评论。回过头来看,这有点儿愚蠢:除了让阅读变得困难之外,没有任何真正的好处... - ReinstateMonica3167040
@elad.chen 或者包含此帖子的链接,以使其更易读! - C-Y

1
如果您正在使用 Node.js 应用程序,则可以使用 leap-year 包:
npm install --save leap-year

然后从您的应用程序中,使用以下代码验证提供的年份或日期对象是否为闰年:

var leapYear = require('leap-year');

leapYear(2014);
//=> false 

leapYear(2016);
//=> true 

使用这样的库的优点在于,您不必处理获取所有特殊情况正确的繁琐细节,因为库会处理这些问题。


21
但是对于这样一个简单的功能,您又向项目添加了另一个依赖项。 对我来说,这是不可接受的。 - Frondor
11
检查三个数的余数来引入一个包实在是荒谬的。 - Kuba Szymanowski
3
是吗?如果你看一下这个问题中的错误答案(人们只是除以4并检查余数),使用一个库可能是某些人明智的决定。该库的优点是它包含测试用例,并且比人们自己编写的错误实现有更好的工作机会(请参见下面的一些示例)。话虽如此,我理解编写自己的快速函数(如果你做对了)可以节省你不用包含一个依赖项 - 各有所好。 - nwinkler
3
另一方面,所有这一切可能都是过度设计。下一个无法使用简单的“year % 4”方法的年份是2100年,而今天构建的大多数软件很可能用不到它。如果你愿意可以添加<讽刺>标签... - nwinkler
没错,虽然很多软件需要处理2000年,但2000年也是闰年。所以,除非你的软件需要处理1900年,否则就没问题了。 - MalcolmOcean

-1
您可以使用以下代码来检查是否为闰年:
ily = function(yr) {
    return (yr % 400) ? ((yr % 100) ? ((yr % 4) ? false : true) : false) : true;
}

1
你能详细说明一下吗? - tsnorri
2
这似乎只是接受答案的重构。它没有更紧凑,也没有执行任何不同的操作,所以我不确定它会增加什么价值。 - Matt Johnson-Pint
12
这几乎就是对三元操作符进行了滥用。 - Willem D'Haeseleer
2
这将是低效的,因为它总是检查一年是否可被400整除。你会得到399次“False”和一次“True”。 - Daut

-11

你可以尝试使用JavaScript的Date对象

new Date(year,month).getFullYear()%4==0

这将返回真或假。


8
它不能处理特殊情况(可被100和400整除)。 - Pif

-15

我的代码非常易于理解

var year = 2015;
var LeapYear = year % 4;

if (LeapYear==0) {
    alert("This is Leap Year");
} else {
    alert("This is not leap year");
}

8
你的代码有误。1900年不是闰年,但你的代码会说它是。 - user149341

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接