解析日期时出现意外异常

时间:2017-02-21 11:08:10

标签: java date-parsing

我试图根据以下代码解析日期但获得异常。以下是代码 -

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)

请帮我确定问题所在。感谢。

4 个答案:

答案 0 :(得分:4)

删除模式中的时间部分:

 DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");

答案 1 :(得分:2)

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-01-23

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

关于java.time

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

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

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

从哪里获取java.time类?

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

答案 2 :(得分:0)

首先,kamehl23的回答是正确的。您解析的字符串可能不会丢失格式中指定的任何parst,因此您需要将格式修改为DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");但是只需要添加一些更有趣的选项:
请记住SimpleDateFormat是不是线程安全的,一般不推荐。明智的Java 8选项是Apache FastDateFormat
joda-time包。
两者都有一些问题但肯定比SimpleDateFormat好得多(Joda-time)包很受欢迎)。
在Java 8中,使用包java.time.format引入了一个新的日期和时间hanling。需要时间来调整它,但它工作得很好,并解决了该领域存在的许多问题。请参阅类DateTimeFormatter。最后,我曾经不得不编写一个实用程序,它可以采用任何格式的String,并尝试将其解析为Date(如果可能)。我写了一篇描述我如何实现该实用程序的文章。我是用Java 8编写的,但这个想法可以在任何版本中实现。见Java 8 java.time package: parsing any string to date

答案 3 :(得分:0)

你正在使用模式" dd-MMM-yyyy hh:mm a"。但实际上" hh:mm a"部分未出现在" 2017年1月23日"值。由于此parse函数无法解析字符串日期。

所以将你的模式改为" dd-MMM-yyyy"它与您的日期字符串匹配。这将删除您获得的异常。