看老外java.sql.date中date的处理

今天写了个小程序,是一个注册页面,将注册信息加入到Mysql数据库中,在注册页面中对数据没有进行校验,写完后,自己试了试,发现很好。然后让同学也来试了试,结果一运行就出错。后来才发现是date型数据转换时错了。

我用了

Data birthday=java.sql.Date.valueOf(sbirthday.trim());

这样的方式来进行数据转换,结果问题就是出现在这里。

我同学输入生日日期是输入的 1988-8-8,一旦不是按照 yyyy-mm-dd 的格式就出错。我想难道这样的日期就不能转换吗?

然后我查看了 jdk1.6的源代码:它竟然就是这样处理的:

 

public static Date valueOf(String s) {

        final int YEAR_LENGTH = 4;//定义了年的长度。

        final int MONTH_LENGTH = 2;//定义了月的长度

        final int DAY_LENGTH = 2;//定义了日的长度

        final int MAX_MONTH = 12;//定义了月的最大长度

        final int MAX_DAY = 31;//定义了日的最大长度

        int firstDash;//定义了一个角标(我也不知道怎么称呼)

        int secondDash;//定义了一个角标(我也不知道怎么称呼)

        Date d = null;//预定义了日期。

 

        if (s == null) {

            throw new java.lang.IllegalArgumentException();

        }

 

        firstDash = s.indexOf('-');

        secondDash = s.indexOf('-', firstDash + 1);

        if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length()-1)) {

            String yyyy = s.substring(0, firstDash);

            String mm = s.substring(firstDash + 1, secondDash);

            String dd = s.substring(secondDash + 1);

 

//问题就出现在这里,它会先校验切割后的日期是否年为4位,月为2位,日为2位,否则d就为null,抛出异常。

//难道老外就不会处理吗?

            if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH &&

                dd.length() == DAY_LENGTH) {

                int year = Integer.parseInt(yyyy);

                int month = Integer.parseInt(mm);

                int day = Integer.parseInt(dd);

                if (month >= 1 && month <= MAX_MONTH) {

                    int maxDays = MAX_DAY;

                    switch (month) {

                        // February determine if a leap year or not

                        case 2:

                            if((year % 4 == 0 && !(year % 100 == 0)) || (year % 400 == 0)) {

                                maxDays = MAX_DAY-2; // leap year so 29 days in February

                            } else {

                                maxDays = MAX_DAY-3; //  not a leap year so 28 days in February 

                            }

                            break;

                        // April, June, Sept, Nov 30 day months

                        case 4:

                        case 6:

                        case 9:

                        case 11:

                            maxDays = MAX_DAY-1;

                            break;

                    }

                    if (day >= 1 && day <= maxDays) {

                        d = new Date(year - 1900, month - 1, day);

                    }

                }

            }

        }

//如果你的日期格式不正确,那就等着抛出异常吧!!!

        if (d == null) {

            throw new java.lang.IllegalArgumentException();

        }

        return d;

    }

 

 

看来,老外写代码是非常严谨的。他会把这个问题交给用户处理,然后按照你交给他的合格数据进行严格的处理。否则会出现很多格式不严谨的数据提交给jdk,那就乱了!

 

看源代码会发现好多问题。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值