解析日期时意外的异常

问题描述:

我想解析日期根据下面的代码,但得到异常。下面是代码 -解析日期时意外的异常

public class DateTest { 
    public static void main(String args []) { 
     String start = "23-Jan-2017"; 
     DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy hh:mm a"); 

     try { 
      Date parsedDate = dateFormatTripStartDate.parse(start); 
      System.out.println(parsedDate); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

异常

java.text.ParseException: Unparseable date: "23-Jan-2017" 
    at java.text.DateFormat.parse(DateFormat.java:357) 
    at DateTest.main(DateTest.java:18) 

请帮我找出问题所在。谢谢。

+0

您使用的格式必须匹配您解析字符串的格式。 –

+1

A [MCVE](http://*.com/help/mcve)从1代表用户?我说是! +1 –

+0

有趣地你可以做到这一点的其他方式:字符串可以包含日期后多余字符,他们只是被忽略。但是字符串不能比格式模式所需要的更短。 –

在你的模式中删除部分时间:

所有的
DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy"); 
+0

注意,相反的作品,具有在'字符串date'但不是在由于该图案中的时间的一部分是用于解析'String'图案 – AxelH

首先,从kamehl23的答案是正确的。您的分析字符串可能不会缺少格式中指定的任何分句,因此您需要将格式修改为DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");。但是,只需添加更多有趣的选项:
请记住,SimpleDateFormat不是线程安全的,通常不推荐。明智的Java前8选项
Apache FastDateFormat
joda-time包。
两者都有一些问题,但肯定远远好于SimpleDateFormat(Joda时间包非常受欢迎)。
在Java 8新的日期和时间hanling与包装推出java.time.format这需要时间来适应它,但它的作品精彩而解决了在这一领域存在的许多问题。见类DateTimeFormatter
最后,我曾经写过一个实用程序,它可以采用任何格式的字符串,并尽可能将其解析为日期。我写了一篇描述我如何实现该实用程序的文章。我在Java 8中编写了它,但是这个想法可以在任何版本中实现。请参阅Java 8 java.time package: parsing any string to date

您正在使用模式“dd-MMM-yyyy hh:mm a”。但实际的“hh:mm a”部分不存在于“2017年1月23日”值中。由于parse函数不能解析String日期。

因此改变你的模式,以“DD-MMM-YYYY”相匹配的日期字符串。这将消除你得到的异常。

TL;博士

LocalDate.parse( 
    "23-Jan-2017" , 
    DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US) 
) 

使用java.time

其他的答案是关于格式化图案不匹配的输入数据是正确的。但问题和其他答案都过时了。

现代的方式是与取代麻烦的旧日期,时间类java.time类。

LocalDate类代表没有时间和没有时区的仅有日期的值。

DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MMM-uuuu" , Locale.US); 
LocalDate ld = LocalDate.parse("23-Jan-2017" , f); 

ld.toString():2017年1月23日

指定Locale作为决定用于转换的月份的名称人类的语言。如果省略,则隐式使用JVM的当前默认值Locale。该默认值可以随时由JVM中任何应用程序的任何线程中的任何代码进行更改,因此不要依赖它。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter,andfz more