时间解析报错

java.sql.SQLException:无法将值’2023-07-29 19:37:34.000‘从第2列转换为时间戳

java.sql.SQLException: Cannot convert value '2023-07-29 19:37:34.000000' from column 2 to TIMESTAMP.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
        at com.mysql.jdbc.ResultSetRow.getTimestampFast(ResultSetRow.java:1336)
        at com.mysql.jdbc.BufferRow.getTimestampFast(BufferRow.java:575)
        at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:6686)
        at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:6005)
        at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:4961)
        at com.mysql.jdbc.ResultSetImpl.getObject(ResultSetImpl.java:5011)
        at com.freeware.gridtag.DBGrid.getColumnValue(DBGrid.java:712)
        at com.freeware.gridtag.DBGrid.drawGridWithOutColumns(DBGrid.java:2550)
        at com.freeware.gridtag.DBGrid.doEndTag(DBGrid.java:600)
        at org.apache.jsp.mainReport_jsp._jspService(mainReport_jsp.java:725)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

问题原因: 无法将数据库时间值转换为TIMESTAMP,这是com.mysql.jdbc.ResultSetRow.getTimestampFast上mysql连接器中的一个bug。

解决办法

1.可以通过将useFastDateParsing=false添加到JDBC connection URL来禁用快速日期解析。

url: jdbc:mysql://39.107.193.97:3336/lwtest?autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useFastDateParsing=false

2.尝试使用更高版本数据库。MySQL 5.6.4及之后版本对小数秒有额外支持。(MySQL 5.6.4之前的版本,它是在没有微秒的情况下存储的)

### Java 时间格式解析错误的原因及解决方案 #### 错误原因分析 在Java中,`IllegalArgumentException`通常会在尝试解析不符合预期格式的时间字符串时抛出。这种异常可能由以下几个常见原因引起: 1. **输入时间字符串与指定的格式不匹配** 如果使用的`SimpleDateFormat`或`DateTimeFormatter`对象所定义的模式与实际传入的时间字符串不符,则会触发此异常[^2]。 2. **未正确设置区域(Locale)信息** 不同的语言环境可能会导致日期中的月份名称、星期几等字段有所不同。如果未显式指定正确的`Locale`,则可能导致解析失败。 3. **时间字符串包含非法字符或超出范围的数据** 例如,“February 30”显然是不可能存在的日期;或者某些特殊字符未能被正确定义到格式模板中也会造成问题。 4. **线程安全问题** `SimpleDateFormat`不是线程安全的对象,在多线程环境下共享同一个实例容易引发不可预测的行为甚至抛出异常。虽然这不一定直接关联于上述提到的具体异常情况,但在设计程序逻辑时仍需注意这一点。 #### 解决方案说明 为了有效应对这些潜在的问题并实现稳健的时间处理功能,可以从以下几个方面着手改进代码质量: 1. **严格验证输入数据的有效性和一致性** 在执行任何转换操作之前先确认待处理的时间串确实遵循目标格式标准。可以通过预设一系列合法样例来进行初步筛查过滤掉明显不合规格的内容。 2. **明确声明所需的本地化参数** 当涉及到自然语言表述部分如月名缩写等形式要素的时候一定要记得给定恰当的地区设定来保障解释过程顺利进行。 3. **采用更现代化API替代旧版组件** 推荐使用自JDK8引入以来广受好评的新一代日期时间框架——JSR-310(`java.time`)系列类库代替老旧易犯错的传统方法论。新接口不仅提供了更加直观简洁的操作方式而且天然具备更好的并发性能表现[^1]。 以下是基于现代API的一个简单示范案例展示如何利用`DateTimeFormatter`完成定制化的日期格式化/反序列化进程: ```java import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class Main { public static void main(String[] args){ String dateStr = "Wednesday January-07-2021"; try{ DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendText(ChronoField.DAY_OF_WEEK) .appendLiteral(' ') .appendText(ChronoField.MONTH_OF_YEAR) .appendPattern("-dd-yyyy") .toFormatter(Locale.ENGLISH); LocalDate parsedDate = LocalDate.parse(dateStr.trim(),formatter); System.out.println(parsedDate); }catch(Exception e){ System.err.println(e.getMessage()); } } } ``` 该片段展示了构建复杂混合型样式的能力同时强调了适当运用辅助工具类的重要性以便达成精确控制每一个细节的目的。 另外针对可能出现的各种边界状况也要做好充分准备比如增加额外层次校验机制确保最终结果始终处于合理区间范围内等等措施都是不可或缺的一部分组成部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值