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格式
- String 转 java.sql.Timestamp 异常详解
- MyBatis3.3.0关于invalid comparison: java.sql.Timestamp and java.lang.String异常的解决
- java.sql.Timestamp的格式String转换
- java.lang.string cannot be cast to java.sql.timestamp
- mybatis invalid comparison: java.sql.Timestamp and java.lang.String
- oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp 异常的解决办法
- 将时间转换为时间戳,java.sql.Timestamp <<--- String
- weblogic 异常 oracle.sql.TIMESTAMP
- 类 java.sql.Timestamp
- java.sql.Timestamp
- java.sql.timestamp
- string 转timestamp
- String转Date, Timestamp
- JAVA Calendar Date Timestamp String
- java.lang.ClassCastException java.sql.Timestamp cannot be cast to java.lang.String
- [转载]java Timestamp、Date和String之间的互转
- java Timestamp、Date和String之间的互转
- java里面String,Date,TimeStamp之间的互转
- iOS App上架流程
- Error:2002:Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
- android 应用自动升级安装并打开新版本应用
- java SSM 框架 多数据源 代码生成器
- 关于 iOS自定义转场动画
- String 转 java.sql.Timestamp 异常详解
- Linux学习目录
- 【BLE-CC2640】CC2640之按键
- Android的位深
- 点击控件 让ListView或者ScrollView 返回到顶部
- 下载的谷歌卫星地图如何发布地图服务的两种方法
- Apache服务器入门
- 安卓调用系统摄像头拍照并保存到本地
- hibernate 反向工程