我试图根据以下代码解析日期但获得异常。以下是代码 -
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 :(得分:4)
删除模式中的时间部分:
DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");
答案 1 :(得分:2)
LocalDate.parse(
"23-Jan-2017" ,
DateTimeFormatter.ofPattern( "dd-MMM-uuuu" , Locale.US )
)
其他答案对于格式化模式不匹配输入数据是正确的。但问题和其他答案都已过时。
现代的方法是使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和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"它与您的日期字符串匹配。这将删除您获得的异常。