解析日期时意外的异常
我想解析日期根据下面的代码,但得到异常。下面是代码 -解析日期时意外的异常
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");
注意,相反的作品,具有在'字符串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类?
-
Java SE 8和SE 9后来
- 内置。
- 带捆绑实现的标准Java API的一部分。
- Java 9增加了一些次要功能和修复。在ThreeTen-Backport
-
Java SE 6和SE 7
- 大部分的java.time功能后移植到Java 6 & 7。
-
Android
- 的ThreeTenABP项目适应ThreeTen-反向移植(上述)为Android特异性。
- 参见How to use ThreeTenABP…。
的ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
,andfz more。
您使用的格式必须匹配您解析字符串的格式。 –
A [MCVE](http://*.com/help/mcve)从1代表用户?我说是! +1 –
有趣地你可以做到这一点的其他方式:字符串可以包含日期后多余字符,他们只是被忽略。但是字符串不能比格式模式所需要的更短。 –