2017-12-02 169 views
0
String str = "Jan 15"; 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd"); 
    LocalDate parsed = LocalDate.parse(str, formatter); 

我不斷收到此異常:在線程的Java DateTimeFormatter不能轉換

異常「主要」 java.time.format.DateTimeParseException: 文本「1月15日」不能在指數解析0在 java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947) 在 java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) 在java.time.LocalDate.parse(LOCALDATE。 java:400)at com.mach5.T.main(T.java:17)

有人可以幫我嗎?

+0

https://stackoverflow.com/questions/36113530/java-convert-string-date-to-month-name-year-mmm-yyyy – prsvr

+0

@FairPlay不,你的鏈接(https:// stackoverflow。 com/questions/36113530/java-convert-string-date-to-month-name-year-mmm-yyyy)不是重複的。另一個問題是關於從一個全年的月份日值中生成一個年份的字符串,而這個問題是關於*解析*沒有任何年份的月份日值。我相信這裏的問題確實是重複的,但我還沒有找到真正的原創。 –

回答

1

你可以做到以下幾點:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
           .appendPattern("MMM dd") 
           .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue()) 
           .toFormatter(); 
    LocalDate parsed = LocalDate.parse(str, formatter); 
1

不能創建一個沒有一年LOCALDATE的。

因此,無論你需要添加一個。

 String str = "Jan 15 2016"; 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy", Locale.ENGLISH); 
     LocalDate parsed = LocalDate.parse(str, formatter); 

或者您可以修改格式器填寫當前年份,您可以檢查this post

String str = "Jan 15"; 
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
      .appendPattern("MMM d") 
      .parseDefaulting(ChronoField.YEAR, Year.now(ZoneId.systemDefault()).getValue()) 
      .toFormatter(Locale.ENGLISH);; 
    LocalDate parsed = LocalDate.parse(str, formatter); 
2

TL;博士

解析作爲MonthDay而非LocalDate

MonthDay.parse( 
    "Jan 15" , 
    DateTimeFormatter.ofPattern("MMM dd" , Locale.US) 
) 

--01-15

MonthDay

您輸入缺少了一年,所以它不能被解析爲一個LocalDate。相反,解析爲MonthDay

如果您正在解析代表月份日的字符串,請使用代表月份日值的類。該課程將是MonthDay

DateTimeFormatter f = DateTimeFormatter.ofPattern("MMM dd" , Locale.US) ; 
String input = "Jan 15" ; 
MonthDay md = MonthDay.parse(input , f) ; 

md.toString():--01-15

即雙連字符在所產生的輸出串遵循ISO 8601標準,指示一年是未知的/刪去。

LocalDate

如果知道的話,您可以一年分配。

LocalDate ld = md.atYear(2017) ; 

ld.toString():2017年1月15日

看到這個code run live at IdeOne.com


關於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的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore

相關問題