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
时间: 2024-10-22 02:22:57

java和javascript日期校验和闰年问题分析和解决方案的相关文章

Javascript日期级联组件代码分析及demo

最近研究下JS日期级联效果 感觉还不错,然后看了下kissy也正好有这么一个 组件,也看了下源码,写的还不错,通过google最早是在2011年 淘宝的虎牙(花 名)用原审JS写了一个(貌似据说是从YUI那边重构下的) 具体的可以看他的 博 客园 , 感觉kissy组件源码 思路也是和YUI类似 所以我今天的基本思路也和他们 的一样 只是通过自己分析下及用自己的方式包装下. 基本原理 1.传参中有 '年份下拉框dom节点', '月份下拉框dom节点', '天数下拉框dom 节点', "开始日期&

javascript日期计算实例分析

  本文实例讲述了javascript日期计算.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 function setLeaveDate(){ var inDay=$("#date_6").val(); // 获取的日期格式为2014-07-03 var date=inDay.split('-'); // 将日期分隔成数字 var num=$(&quo

javascript日期计算实例分析_javascript技巧

本文实例讲述了javascript日期计算.分享给大家供大家参考.具体如下: function setLeaveDate(){ var inDay=$("#date_6").val(); // 获取的日期格式为2014-07-03 var date=inDay.split('-'); // 将日期分隔成数字 var num=$(".time_lk").val()*1; // 需增加的天数 var year=date[0]*1; var month=date[1]*1

JavaScript日期类型的一些用法介绍

 这篇文章主要介绍了JavaScript日期类型的一些用法介绍,本文讲解了获取某个月份的天数.获取时区.计算运行时间.删除cookie等用法,需要的朋友可以参考下     获取某个月份的天数 相信大家读小学的时候就知道一年十二个月各有多少天了,这里面有个特殊的存在--2月.闰年的2月有29天,非闰年的2月只有28天.估计不少人跟我一样,已经不记得闰年的规则了,这时候,下面的这个方法就派上用场了. 代码如下: var date = new Date(2013, 2, 0); date.getDat

Java和JavaScript中使用Json方法大全

[本文转载于 Java和JavaScript中使用Json方法大全 ] 摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率). 一.准备工作      

比较全面的C 、Java、JavaScript中的正则表达式详解_正则表达式

什么是正则表达式? 正则表达式(Regular Expression) 就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗 * 浩":那么"罗 * 浩"就是公式,也称作 模式(Pattern) ,这篇文章就是 要匹配的串( 或叫文本 text) .再如,你要检查输入的一个字符串是否是 126 邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开

Java 获取指定日期的实现方法总结_java

格式化日期 String-->Date 或者 Data-->String SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse("2009-11-04");//String-->Date String sdate = sdf.format(date );// Data-->String =========================

Java中的日期和时间类以及Calendar类用法详解_java

Java日期和时间类简介 Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个: Date():使用当前的日期和时间初始化一个对象. Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒.如果运行 Java 程序的本地时区是北京时区(

Javascript日期格式化format函数的使用方法_javascript技巧

前言 Javascript日期格式化在日常开发中还是挺常见的,那么下面就给大家分享Javascript时间格式format函数的两种使用方法示例,一起来看看. 方法一 Date.prototype.pattern=function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+" : this.getDate(), //日 "h+" : this.getHours()%12 == 0 ? 1