2017-08-10 110 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