2017-08-10 119 views
0

我使用此代碼格式化一個格式化的文本字段中輸入一個月&日:的Java 8格式的日期輸入

SimpleDateFormat sdf = new SimpleDateFormat("MM.dd"); 
DateFormatter df = new DateFormatter(sdf); 
DefaultFormatterFactory ddf = new DefaultFormatterFactory(df, df, df, df); 
datumTextField.setValue(new Date(System.currentTimeMillis())); 
datumTextField.setFormatterFactory(ddf); 

當輸入一個無效的日期,如。 13.10,魔術師在此行後將其更改爲1.10:

DateOfAdding = datumTextField.getText(); 

因此DateOfAddig值爲1.10。

如何打開magican?

+3

A *魔術師* ...?它看起來像字段只是將最接近的近似值返回到它可以有效的日期。更清楚地描述問題所在。 – hnefatl

+2

請發表[mcve]。然後描述您所執行的**精確**步驟和程序顯示的**精確**行爲。如有必要,請使用屏幕截圖補充您的描述。 –

+1

僅供參考,您正在使用現在已遺留的麻煩的舊類,由java.time類取代。 –

回答

0

您需要將SimpleDateFormatsetLenient方法作爲參數調用false,以便將用於解析的基礎日曆設置爲非寬鬆。

非寬鬆的日曆將拒絕不在該字段的預期範圍內的字段值,而不是接受它們並修改其他字段以使其具有意義:在您的情況中,該月份已翻轉12並且達到1,而今年增加了1,可能達到1971年,而不是默認的時候,1970年不明

Calendar's javadoc

寬大

日曆有解釋兩種模式日曆字段,lenien噸和非寬鬆。當日歷處於寬鬆模式時,它會接受比其生成的更寬範圍的日曆字段值。當日歷重新計算日曆字段值以便get()返回時,所有日曆字段都將被標準化。例如,寬鬆的GregorianCalendar將MONTH == JANUARY,DAY_OF_MONTH == 32解釋爲2月1日。

當日歷處於非寬鬆模式時,如果日曆字段中存在任何不一致,則會引發異常。例如,GregorianCalendar總是生成1和月份長度之間的DAY_OF_MONTH值。如果任何超出範圍的字段值已設置,則非寬鬆的GregorianCalendar將在計算其時間或日曆字段值時引發異常。

1

TL;博士

MonthDay.parse( 
    "12.31" , 
    DateTimeFormatter.ofPattern("MM.dd") 
) 

捕捉DateTimeParseException爲無效的輸入。

java.time.MonthDay

現代的方法使用java.time類,而不是在問題中看到的麻煩遺產類。

其中java.time類是MonthDay,正是你所需要的。

我建議收集輸入爲兩個不同的數字。

MonthDay md = MonthDay.of(x , y) ; 

如果你堅持,你可以收集輸入爲一個組合字符串和parse。如果是這樣,我建議你和你的用戶使用標準ISO 8601格式:--MM-DD

MonthDay md = MonthDay.parse("--12-31") ; 

或者使用DateTimeFormatter定義模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern("MM.dd") ; 
MonthDay md = MonthDay.parse(input , f) ; 

陷阱爲DateTimeParseException檢測無效輸入。

String input = "13.10" ; // Invalid input. Month must be 1-12. 
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM.dd") ; 
MonthDay md = null ; 
try 
{ 
    md = MonthDay.parse(input , f) ; 
} catch (DateTimeParseException e) { 
    // … handle error … 
    System.out.println("Invalid input: " + input) ; 
} 

看到這個code run live at IdeOne.com

輸入無效:13.10

E:java.time.format.DateTimeParseException:文本'13 0.10' 無法解析:無法從TemporalAccessor獲得MONTHDAY:{MonthOfYear = 13,DAYOFMONTH = 10},型的ISO java.time.format.Parsed

md.toString():空

+0

是的,比我更好的解決方案,尤其是因爲問題有[tag:java-8]標籤 – Aaron