java和javascript日期校验和闰年问题分析和解决方案

简介:

1.闰年的介绍

地球绕太阳运行周期为365天5小时48分46秒(合365.24219天)即一回归年。公历的平年只有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天,故四年于2月加1天,使当年的历年长度为366日,这一年就为闰年。

现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的,虽然是4的倍数,也是平年,这就是通常所说的:四年一闰,百年不闰,四百年再闰。 例如,2000年是闰年,1900年则是平年。

由于地球的自转速度逐渐降低,而公转速度则相对更加稳定,所以上述的系统经过更长的周期也会发生微小的误差。在长远的将来,针对闰年的微小调整应该不是由预定的系统决定,而是随时不定性的。

既然是这样,在系统开发过程中,是否需要判断几百年后的事情呢?没有太大必要,如果一个系统能够使用几百年,也该寿终正寝了。

 

2.如何进行日期校验

系统中常有三种做法,第一种是使用语言自身的日期对象特性,第二种就是将日期转换为某一个特定的格式,然后拆分出来年月日,判断年份、月份、日期。两种方法在javascript和java中都适用,第二种方法不推荐。

另外一种,使用正则表达式来校验,正则表达式通常非常复杂,难以理解,这种方法对100倍数闰年校验存在隐患。

 

2.1  使用日期对象校验

2.1.1.1Javascript的日期对象

将指定的格式日期字符串转换成标准的格式(比如yyyy-mm-dd),对年月日进行拆解,通过年月日参数生产Date(年,月,日)对象,再得到Date对象的年月日,和拆解之后的年月日进行比较,看结果是否一致。

通过Date(年,月,日)创建对象,会自动转换非法日期,比如:传入1月和32号的日期,会自动升级为2月1日,比较年月日不一致说明日期非法。

Date对象的构造方法,月份是从0开始的,0表示1月。参考下表:

 

代码示例:

2.1.1.2Java的日期对象

Java中提供了丰富的类,可以直接校验日期,如果不能使用java的类库校验自定义的一些日期,也可以自己编写规则进行校验,参考javascript的方法。

更多参考java.util.Date的API

代码示例:

 

2.2  拆分年月日校验

    山寨做法,不推荐使用。

2.3  正则表达式校验

下面这个是摘录自某系统中的正则表达式,格式化之后也很难理解。这个正则表达式只考虑年数是4的倍数的年份,对于100的倍数的则存在问题,比如1900年、2100年就不是闰年,也会校验通过,不能在系统中使用。

支持的格式为:

1)0012/02/29

2)2012/2/29

3)2012 02 29

4)2012 2 01

5)2100 2 1

3.对日期自动升级的说明

通过Date(年,月,日)创建对象,会自动转换非法日期,比如:传入1月和32号的日期,会自动升级为2月1日,比较年月日不一致说明日期非法。

3.1Javascript的转换

代码,参考Javascript的Date API

结果:

 

3.2Java的转换

代码,参考Java的Date对象API

结果:

2100-3-2

4.开发注意事项

1.系统对于标准的日期输入,尽量使用日期控件,只能选择,不能修改;对于可以手工输入和修改的日期,需要增加校验。

2.有些业务规则跟闰年有关,开发过程中一定要跟业务确认清楚,比如:有效期天数,碰到闰年的情况,每年的天数可能就有一天的差别。

 

  • 大小: 33.3 KB
  • 大小: 43.2 KB
  • 大小: 33.4 KB
  • 大小: 59.4 KB
  • 大小: 53.9 KB
  • 大小: 32.9 KB
  • 大小: 12.3 KB
  • 大小: 30.7 KB
  • 大小: 33.4 KB
目录
相关文章
|
30天前
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
121 0
|
1月前
|
关系型数据库 MySQL Java
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
61 0
|
30天前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
504 1
|
1月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
67 1
|
7天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
24 3
|
11天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
12天前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
13天前
|
Java API Apache
|
16天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
33 2
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2