为什么我会收到无法解析的日期异常?

时间:2015-07-20 14:31:33

标签: java date simpledateformat

我无法使用SimpleDateFormat解析日期。我试过这段代码:

SimpleDateFormat fechas = new SimpleDateFormat("dd/MM/yyyy hh:mm");

if (data[i].length() > 1) {
    Date f = (Date) fechas.parse(data[i]);
    System.out.println(i + " " + f);
}

我收到以下错误:

Exception in thread "main" java.text.ParseException: Unparseable date: "01/06/2015 8:20

我使用以下代码再次遇到同样的问题:

SimpleDateFormat fech = new SimpleDateFormat(" yyyy/MM/dd HH:mm:ss");
Date date = (Date) fech.parse(data[i]);
System.out.println(date);

哪个给出了错误

Exception in thread "main" java.text.ParseException: Unparseable date: "00015/06/01  08:20:15"

如何解决此问题?

4 个答案:

答案 0 :(得分:2)

使用SimpleDateFormat时,日期格式必须与完全匹配相匹配。在您的示例中,您包括日期,但在日期格式中,您还指定了小时和分钟。如果您的数据有该文本,它将起作用。例如,使用您的第一个示例:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class DateDemo {
  public static void main(String args[]) throws Exception {
    String yourData = "01/06/2015";
    String matchingData = "01/06/2015 13:00";
    SimpleDateFormat fechas = new SimpleDateFormat("dd/MM/yyyy hh:mm");

    Date matchingDate = fechas.parse(matchingData);
    System.out.println("String: \"" + matchingData + "\" parses to " + matchingDate);
    Date yourDate = fechas.parse(yourData);
    System.out.println("String: \"" + yourData + "\" parses to " + yourDate);
  }
}

输出:

String: "01/06/2015 13:00" parses to Mon Jun 01 13:00:00 CDT 2015
Exception in thread "main" java.text.ParseException: Unparseable date: "01/06/2015"
        at java.text.DateFormat.parse(DateFormat.java:366)
        at Demo.main(Demo.java:14)

答案 1 :(得分:1)

TL;博士

  

如何解决此问题?

将格式设置与输入匹配。

LocalDateTime.parse( 
    "01/06/2015 8:20" , 
    DateTimeFormatter.ofPattern( "dd/MM/uuuu H:m" )
)
.toString()
  

2015-06-01T08:20

java.time

正如其他人所述,您的格式化模式无法与您的字符串输入匹配。

此外,您使用的是 java.time 类在几年前取代的麻烦的旧日期时间类。

您的时间小时缺少填充零。因此,您应该使用一个h而不是两个hh。此外,小写h表示12小时制,由于缺少AM / PM指示,您的输入似乎是24小时制。因此,大写H是有序的。

String input = "01/06/2015 8:20" ;  // Notice the lack of a padding zero on the hour.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu H:m" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
  

ldt.toString():2015-06-01T08:20

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

您的约会日期String以及SimpleDateFormat()中的模式应符合: -

SimpleDateFormat("dd/MM/yyyy hh:mm")将与01/06/2015 2:24

一起使用

SimpleDateFormat("yyyy/MM/dd HH:mm:ss")将与2015/06/01 08:20:15

一起使用

有关完整列表,请参阅官方Oracle Doc here

答案 3 :(得分:0)

na.rm

我就像源代码那样做