前言

处理时间时,常常要考虑用户的输入是否合法,其中一个很典型的场景就是平闰年的判断,网上其实有很多类似的算法,但是其实不必那么麻烦,下面我讲讲的我的思路。

规则

公元年数可被4整除为闰年,但是整百(个位和十位均为0)的年数必须是可以被400整除的才是闰年(比如1900年不是闰年),其他都是平年。例如:1997年是平年,2002年是平年;1996年是闰年,2000年是闰年。平年二月有28天,而闰年二月有29天。

最根本的原因是:地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年(tropicalyear)。公历的平年只有365日,比回归年短约0.2422日,所余下的时间约为每四年累计一天,故第四年于2月末加1天,使当年的历年长度为366日,这一年就为闰年。现行公历中每400年有97个闰年。

按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来。因此每四百年中要减少三个闰年。所以公历规定:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的年份,即使是4的倍数也不是闰年。

这就是通常所说的:四年一闰,百年不闰,四百年再闰。

分析

根据上述规则,我们总结一下哪些可以用得上:

  1. 能被4整除但是不能被100整除 (year % 100 !== 0 && year % 4 === 0)
  2. 能被400整除且能被100整除 (year % 400 === 0 && year % 100 === 0)
  3. 2月有29天

emmm,第三条规则是废话吗?

No,no,no,no, 这才是闰年的本质,我们只要找出本质就可以。

所以呢,规则的一和二只是为了去满足规则3的,不用绕弯子。

方案

其实呢,js的new Date这个方法是有彩蛋的。

var date = new Date(2017, 3, 0)//(ÒωÓױ)!
date.toString();//Tue Feb 28 2017 00:00:00 GMT+0800 (中国标准时间)
//这说明了2017年2月最后一天是28号,也就是2017为平年。

所以我们只需要判断年度的二月最后一天是不是28号就行了。

最新文章

  1. 通过使用OpenVPN来构建一个VPN
  2. POJ 3057 Evacuation 二分图匹配
  3. Ambari工具之认识学习01
  4. 【小姿势】如何搭建ipa下载web服务器(直接在手机打开浏览器安装)
  5. ELK_elk+redis 搭建日志分析平台
  6. SQL 四种基本数据操作语句的基本使用
  7. webpack 代码拆分,按需加载
  8. 关于read only file system问题解决方案
  9. iOS团队开发者测试
  10. CSS3 选择器——伪类选择器
  11. Beautiful People 分类: Brush Mode 2014-10-01 14:33 100人阅读 评论(0) 收藏
  12. 问题-Delphi2007跟踪变量时提示“E2171 Variable 'APolygon' inaccessible here due to optimization”
  13. 用perl对字符串进行全角转半角操作
  14. codereview介绍
  15. LightOj_1364 Expected Cards
  16. Android项目实战(三十九):Android集成Unity3D项目(图文详解)
  17. WPF设置控件获得焦点
  18. MongoDB exception:connection failed
  19. Mybatis下的sql注入
  20. 【python】闭包

热门文章

  1. Leetcode题解(十九)
  2. 2016-2017 ACM-ICPC, Asia Tsukuba Regional Contest D Hidden Anagrams
  3. OR in Matrix
  4. C# 面向对象基础&封装&继承&多态&加深一下冒泡排序写法
  5. Django中ORM表的创建以及基本增删改查
  6. Javascript实现简单跨域调用
  7. [转载] Java NIO与IO
  8. Java build path && Deployment assembly && 编译路径 && 发布路径
  9. MySQL Flush Data
  10. android引入百度地图之最简单的例子-HelloBaiDuMap