String 转 java.sql.Timestamp 异常详解

来源:互联网 发布:mac有安卓模拟器吗 编辑:程序博客网 时间:2024/05/20 09:44

在String转Timestamp时,可调用Timestamp.valueOf(dateStr),可能会遇到下面这种异常,java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]。今天就遇到了这种问题,于是去翻翻源码。抛出该异常,可以有好几处:

1、dataStr 日期和时间之间需要空格隔开

        dividingSpace = s.indexOf(' ');        if (dividingSpace > 0) {            date_s = s.substring(0,dividingSpace);            time_s = s.substring(dividingSpace+1);        } else {            throw new java.lang.IllegalArgumentException(formatError);        }

2、转换日期时,检验日期的年月日长度和范围,要求年要等于四位(yyyy),月要大于等于1位并且小于等于两位而且小于等于12(MM),日要大于等于1位并且小于等于两位而且小于等于31(dd)

// Convert the date        boolean parsedDate = false;        if ((firstDash > 0) && (secondDash > 0) && (secondDash < date_s.length() - 1)) {            String yyyy = date_s.substring(0, firstDash);            String mm = date_s.substring(firstDash + 1, secondDash);            String dd = date_s.substring(secondDash + 1);            if (yyyy.length() == YEAR_LENGTH &&                    (mm.length() >= 1 && mm.length() <= MONTH_LENGTH) &&                    (dd.length() >= 1 && dd.length() <= DAY_LENGTH)) {                 year = Integer.parseInt(yyyy);                 month = Integer.parseInt(mm);                 day = Integer.parseInt(dd);                if ((month >= 1 && month <= MAX_MONTH) && (day >= 1 && day <= MAX_DAY)) {                    parsedDate = true;                }            }        }        if (! parsedDate) {            throw new java.lang.IllegalArgumentException(formatError);        }

3、在转换时间,也是如此。

        // Convert the time; default missing nanos        if ((firstColon > 0) & (secondColon > 0) &            (secondColon < time_s.length()-1)) {            hour = Integer.parseInt(time_s.substring(0, firstColon));            minute =                Integer.parseInt(time_s.substring(firstColon+1, secondColon));            if ((period > 0) & (period < time_s.length()-1)) {                second =                    Integer.parseInt(time_s.substring(secondColon+1, period));                nanos_s = time_s.substring(period+1);                if (nanos_s.length() > 9)                    throw new java.lang.IllegalArgumentException(formatError);                if (!Character.isDigit(nanos_s.charAt(0)))                    throw new java.lang.IllegalArgumentException(formatError);                nanos_s = nanos_s + zeros.substring(0,9-nanos_s.length());                a_nanos = Integer.parseInt(nanos_s);            } else if (period > 0) {                throw new java.lang.IllegalArgumentException(formatError);            } else {                second = Integer.parseInt(time_s.substring(secondColon+1));            }        } else {            throw new java.lang.IllegalArgumentException(formatError);        }

针对这些检验规则,所以我们写入字符格式的日期时,就要注意了。


异常原因详解:

另外,其实我的问题是异常抛出来

<span style="white-space:pre"></span>String createDate=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss").format(new Date());Timestamp timestamp = Timestamp.valueOf(createDate);System.out.println(timestamp);

对照了异常说明的格式:java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]。发现SimpleDateFormat里似乎是没有错啊。其实这里是真的写错了,正确的写法是yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd HH:mm:ss ,也就是说月份的格式mm必须是大写的,如果是小写,那么月份将获取到的是分钟数,分钟数可能大于12,那么很明显,根据检验规则,一定会抛异常。另外一个问题,按这种形式获取时间戳时,小时的格式应该使用大写HH,HH表示24小时制,hh表示12小时制,使用hh时间会不准确,因此推荐使用的格式是:yyyy-MM-dd HH:mm:ss。

下面是示例:

yyyy-mm-dd HH:mm:ss格式



yyyy-MM-dd HH:mm:ss格式



0 0
原创粉丝点击