• 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.有些业务规则跟闰年有关,开发过程中一定要跟业务确认清楚。比方:有效期天数。碰到闰年的情况。每年的天数可能就有一天的区别。

  • 相关阅读:
    jQuery实现选项联动轮播
    EasyUI datagrid 行编辑
    UEditor的使用
    jQuery Pagination分页插件的使用
    SQL Server论坛楼层计算触发器
    编写了一个简单的串口映射工具
    JS表单验证插件(支持Ajax验证)
    JS虚拟键盘
    JS数字键盘
    HTML的select控件美化
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6973639.html
Copyright © 2020-2023  润新知