Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分析日期时发生意外异常_Java_Date Parsing - Fatal编程技术网

Java 分析日期时发生意外异常

Java 分析日期时发生意外异常,java,date-parsing,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 {

我正试图根据以下代码解析日期,但出现异常。下面是代码-

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)

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

删除模式中的时间部分:

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

首先,kamehl23的答案是正确的。您解析的字符串可能不缺少格式中指定的任何PART,因此您需要将格式修改为
DateFormat dateFormatTripStartDate=new SimpleDateFormat(“dd MMM yyyy”)
不过,只需添加几个更有趣的选项:
请记住,
SimpleDateFormat
不是线程安全的,通常不推荐使用。明智的前Java 8选项是

包。
两者都有一些问题,但肯定比
SimpleDateFormat
要好得多(Joda time package非常流行)
在Java8中,通过包
Java.time.format
引入了一个新的日期和时间hanling。调整它需要时间,但它的工作非常出色,解决了该领域存在的许多问题。最后,我曾经编写过一个实用程序,它可以接受任何格式的字符串,并在可能的情况下尝试对其进行分析。我写了一篇文章,描述了我是如何实现该实用程序的。我是用Java8编写的,但是这个想法可以在任何版本中实现。请参见您正在使用的模式“dd-MMM-yyy-hh:mm-a”。但在实际中,“hh:mm a”部分不存在于“2017年1月23日”值中。因此,
parse
函数无法解析字符串日期

因此,将模式更改为“dd-MMM-yyyy”,它与日期字符串匹配。这将删除您得到的异常。

tl;博士 使用java.time 关于格式模式不匹配的输入数据,其他答案是正确的。但这个问题和其他答案都过时了

现代的方法是使用java.time类来取代麻烦的旧日期时间类

该类表示一个仅限日期的值,不包含一天中的时间和时区

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

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


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • 后来
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 该项目专门为Android采用了ThreeTen Backport(如上所述)

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可能会在这里找到一些有用的类,如、、和FZ。

注意,相反的方法是,时间部分在
字符串日期中,但不在模式中,因为这是用于解析
字符串的模式。您使用的格式必须与您解析的字符串的格式匹配?我同意+1有趣的是,您可以采用另一种方式:字符串可能在日期后包含额外的字符,它们只是被忽略。但是字符串不能短于格式模式所需的长度。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US );
LocalDate ld = LocalDate.parse( "23-Jan-2017" , f );