【问题标题】:Unable to remove ParseException无法删除 ParseException
【发布时间】:2019-03-08 18:01:30
【问题描述】:
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 新手。

【问题讨论】:

  • tm 变量的值是多少?也许它与您的格式不匹配。
  • 就像用户通过html页面填写的“YYYY-MM-DD HH:MM:SS”
  • tm中的值必须是String类型,格式必须是合法的。否则这会引发运行时异常。
  • @SarthakSrivastava 您的问题很可能在这里“hh”。这是 1-12,而不是 0-23。使用“HH”
  • 仍然显示无法解析的日期

标签: java web-applications simpledateformat datetime-parsing parseexception


【解决方案1】:

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

我不鼓励使用SimpleDateFormatDateTimestamp。这些类设计不佳且过时已久,尤其是第一个类是出了名的麻烦。相反,我使用的是现代 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 tutorial: Date Time 解释如何使用 java.time。

【讨论】:

    【解决方案2】:

    也许你想试试这个

        String tm = "2014-01-01 00:00:00";
        String frontEndFormat = "yyyy-MM-dd HH:mm:ss";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(frontEndFormat);
        LocalDateTime localDateTime = LocalDateTime.parse(tm, formatter);
        Timestamp timestamp = Timestamp.valueOf(localDateTime);
        //prints 2014-01-01 00:00:00.0
        System.out.println(timestamp);
    

    您会注意到大写的 HH 用于小时,小写的 mm 用于分钟。

    【讨论】:

    • 如果一个人不可避免地需要老式的Timestamp 来获取无法更改的遗留 API(就在现在),那么这是正确的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2014-07-17
    • 2021-02-27
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多