2017-07-05 47 views
3

我正在使用Java 8來解析日期並找到兩個日期之間的差異。java.time.format.DateTimeParseException:在索引3處無法分析文本

這裏是我的代碼片段:

String date1 ="01-JAN-2017"; 
String date2 = "02-FEB-2017"; 

DateTimeFormatter df = DateTimeFormatter .ofPattern("DD-MMM-YYYY", en); 
LocalDate d1 = LocalDate.parse(date1, df); 
LocalDate d2 = LocalDate.parse(date2, df); 

Long datediff = ChronoUnit.DAYS.between(d1,d2); 

當我跑我的錯誤:

java.time.format.DateTimeParseException: Text could not be parsed at index 3

+0

嘗試使用「dd-MMM-yyyy」 – NikNik

+0

它沒有工作.. – Uma

+0

[如何解析不區分大小寫的字符串與jsr310 DateTimeFormatter?](https://stackoverflow.com/questions/10797808/如何解析大小寫不敏感字符串與jsr310-datetimeformatter) –

回答

2

下面的代碼工作。問題在於你正在使用「JAN」而不是「Jan」。 DateTimeFormatter無法識別它。並且還將模式更改爲 「d-MMM-yyyy」。

String date1 ="01-Jan-2017"; 
    String date2 = "02-Feb-2017"; 

    DateTimeFormatter df = DateTimeFormatter.ofPattern("d-MMM-yyyy"); 
    LocalDate d1 = LocalDate.parse(date1, df); 
    LocalDate d2 = LocalDate.parse(date2, df); 

    Long datediff = ChronoUnit.DAYS.between(d1,d2); 

來源:https://www.mkyong.com/java8/java-8-how-to-convert-string-to-localdate/

+0

謝謝。有用。我還有一個問題。它會照顧DayLightSaving時間嗎? – Uma

+2

夏令時,@ Uma不會有任何問題。即使DST從3月26日開始,也就是3月25日至3月26日仍然有1天。使用LocalDate時,完全忽略了只有23小時。實際上,'LocalDate'完全忽略了任何時區,因此也就是任何DST。 –

8

首先,check the javadoc。大寫D代表某一天的一年場(不是天的日只要你想),和大寫Y代表年,只要你想一週爲基礎年場(不)。正確的模式是小寫字母dy

此外,您使用的月份名稱以大寫字母(JANFEB),所以你的格式必須是不區分大小寫(默認行爲是接受像JanFeb只值)。這些月份名稱是英文縮寫,所以您還必須使用英語區域設置來確保它正確解析名稱(使用java.util.Locale類)。

所以,你應該格式化這樣創建:

DateTimeFormatter df = new DateTimeFormatterBuilder() 
    // case insensitive to parse JAN and FEB 
    .parseCaseInsensitive() 
    // add pattern 
    .appendPattern("dd-MMM-yyyy") 
    // create formatter (use English Locale to parse month names) 
    .toFormatter(Locale.ENGLISH); 

這會讓你的代碼工作(和datediff32)。

+4

真的很棒的答案。涵蓋了所有相關的內容,並且正確無誤。 –

+0

添加區域設置非常重要,並且從我的錯誤消息中不明顯(DateTimeParseException:無法在索引0處解析文本)。謝謝你的提示! – Flic

相關問題