前言

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

规则

公元年数可被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. java protected 的细节
  2. Oracle linux6.1配置yum本地源
  3. 2016年10月19日 星期三 --出埃及记 Exodus 19:3
  4. javascript 我是广告
  5. Android服务端本地窗口FramebufferNativeWindow
  6. AndroidUI 侧滑菜单 DrawerLayout的使用
  7. Android访问设置
  8. 条形码/二维码之开源利器ZXing图文介绍(转)
  9. POJ 2329 (暴力+搜索bfs)
  10. LLVM小结
  11. 常见的jquery一些效果
  12. jsplumb 中文教程
  13. (最大连续和/最大子段和) P1115 最大子段和 洛谷
  14. Activity插件化解决方案
  15. 源码编译安装lnmp环境
  16. linux 报错Mysql.pid 文件不存在导致service Mysqld start 失败
  17. linux每日命令(25):Linux文件类型与扩展名
  18. 【F12】网络面板
  19. save is not valid without active transaction
  20. c++的一些编程技巧和细节

热门文章

  1. The Thinking of AutomaticTest(有关自动化测试的思考)
  2. php strcmp()字典排序
  3. Howto: Performance Benchmarks a Webserver
  4. IO流入门-概述
  5. cookies设置时间
  6. Django组件 - cookie、session、用户认证组件
  7. Python高级教程-返回函数
  8. sql查询原理和Select执行顺序
  9. JS操作时间 - UNIX时间戳简单介绍
  10. JavaScript 函数,math对象,Date对象 序列化 总结