簡體   English   中英

解析日期時出現意外異常

[英]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");

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-01-23

指定Locale因為它確定用於翻譯月份名稱的人類語言。 如果省略,則隱式使用JVM的當前默認Locale 任何時候JVM中任何應用程序的任何線程中的任何代碼都可以更改該默認值,因此不要依賴它。


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的課程,如IntervalYearWeekYearQuarter更多

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM