[英]Unexpected exception while parsing date
我試圖根據以下代碼解析日期但獲得異常。 以下是代碼 -
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");
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及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參閱Oracle教程 。 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310 。
從哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的課程,如Interval
, YearWeek
, YearQuarter
和更多 。
首先,kamehl23的答案是正確的。 您解析的字符串可能不會丟失格式中指定的任何parst,因此您需要將格式修改為DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy");
然而,只是添加一些更有趣的選項:
請記住, SimpleDateFormat
不是線程安全的,一般不推薦使用。 明智的Java 8之前的選擇
Apache FastDateFormat和
joda-time包。
兩者都有一些問題,但肯定比SimpleDateFormat
好得多(Joda-time軟件包很受歡迎)。
在Java 8新的日期和時間hanling與包裝推出java.time.format
這需要時間來適應它,但它的作品精彩而解決了在這一領域存在的許多問題。 請參見類DateTimeFormatter 。
最后,我曾經不得不編寫一個實用程序,可以采用任何格式的String,並嘗試將其解析為Date(如果可能)。 我寫了一篇描述我如何實現該實用程序的文章。 我是用Java 8編寫的,但這個想法可以在任何版本中實現。 請參閱Java 8 java.time包:解析迄今為止的任何字符串
您正在使用模式“dd-MMM-yyyy hh:mm a”。 但實際上“hh:mm a”部分並未出現在“2017年1月23日”的價值中。 因為這個parse
函數無法解析String日期。
因此,將您的模式更改為與您的日期字符串匹配的“dd-MMM-yyyy”。 這將刪除您獲得的異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.