首页 > 解决方案 > 无法删除 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 新手。

标签: javaweb-applicationssimpledateformatdatetime-parsingparseexception

解决方案


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,DateTimestamp。这些类设计不佳且过时已久,尤其是第一个类是出了名的麻烦。相反,我使用的是现代 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

  1. 假设用户输入中的小时数是一天中从 00 到 23 的小时,您需要大写HH来解析它们,正如 LppEdd 在评论中已经说过的那样(小写hh是上午或下午从 01 到 12 的小时,当然需要存在 AM 或 PM 标记)。
  2. 由于用户输入不包括秒的分数,因此您不应该.SSS在格式模式中使用(这可能是导致您的异常的原因)。

关联

Oracle 教程:日期时间解释如何使用 java.time。


推荐阅读