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 );