java - 无法删除 ParseException
问题描述
try{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
Date parsedDate = dateFormat.parse(tm);
timestamp = new java.sql.Timestamp(parsedDate.getTime());
}
catch (Exception pe) {
System.out.println("unexpected exception");
System.out.println(pe);
pe.printStackTrace();
}
控制台显示“意外错误”(在我的 catch 块中)。我正在尝试将客户端输入日期的“tm”转换为时间戳。tm 的值类似于“YYYY-MM-DD HH:MM:SS”(字符串)。但是控制台继续显示不可解析的日期。我是 Java 新手。
解决方案
java.time
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
String tm = "2019-02-09 07:35:54";
LocalDateTime dateTime = LocalDateTime.parse(tm, formatter);
System.out.println(dateTime);
这会产生以下输出:
2019-02-09T07:35:54
我不鼓励使用SimpleDateFormat
,Date
和Timestamp
。这些类设计不佳且过时已久,尤其是第一个类是出了名的麻烦。相反,我使用的是现代 Java 日期和时间 API java.time。
JDBC 4.2+
如果您认为您Timestamp
的数据库需要一个,那么您可能不需要。假设您的 JDBC 驱动程序是 JDBC 4.2,您可以直接给它LocalDateTime
我们刚刚生成的对象。例如像:
PreparedStatement ps = yourConnection.prepareStatement(
"insert into your_table(your_timestamp_col) values (?);");
ps.setObject(1, dateTime);
你的代码出了什么问题?
您的格式模式字符串中有两个错误yyyy-MM-dd hh:mm:ss.SSS
:
- 假设用户输入中的小时数是一天中从 00 到 23 的小时,您需要大写
HH
来解析它们,正如 LppEdd 在评论中已经说过的那样(小写hh
是上午或下午从 01 到 12 的小时,当然需要存在 AM 或 PM 标记)。 - 由于用户输入不包括秒的分数,因此您不应该
.SSS
在格式模式中使用(这可能是导致您的异常的原因)。
关联
Oracle 教程:日期时间解释如何使用 java.time。
推荐阅读
- r - 需要从 R 中的数据框中获取满足 R 中特定目标的记录组合
- c++ - 使用 GList 的 prev 指针不适用于我的堆栈
- linux - 在特定文件夹下的 Soalris 中查找硬链接文件
- javascript - 减少。我无法理解如何连接定义为扩展 React.Component 的类的组件以读取商店
- node.js - 通过 beanstalk 部署节点应用程序时的“无数据”健康状态
- authentication - 站点管理员应用程序
- python - Sqlalchemy 查询在雪花上运行,但返回数据不一致
- php - Codeigniter - 输入数据保存在多个数组和数据库表中
- opengl-es - 如何将数据(来自 gleReadPixels)绘制到 OpenGLES 2.0 中的默认(显示)farmebuffer
- excel - 如何激活从 SAP 导出的工作簿?