2017-02-21 125 views
3

我想解析日期根據下面的代碼,但得到異常。下面是代碼 -解析日期時意外的異常

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

您使用的格式必須匹配您解析字符串的格式。 –

+1

A [MCVE](http://stackoverflow.com/help/mcve)從1代表用戶?我說是! +1 –

+0

有趣地你可以做到這一點的其他方式:字符串可以包含日期後多餘字符,他們只是被忽略。但是字符串不能比格式模式所需要的更短。 –

回答

4

在你的模式中刪除部分時間:

所有的
DateFormat dateFormatTripStartDate = new SimpleDateFormat("dd-MMM-yyyy"); 
+0

注意,相反的作品,具有在'字符串date'但不是在由於該圖案中的時間的一部分是用於解析'String'圖案 – AxelH

0

首先,從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

0

您正在使用模式「dd-MMM-yyyy hh:mm a」。但實際的「hh:mm a」部分不存在於「2017年1月23日」值中。由於parse函數不能解析String日期。

因此改變你的模式,以「DD-MMM-YYYY」相匹配的日期字符串。這將消除你得到的異常。

2

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類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如IntervalYearWeekYearQuarter,andfz more