Java 8格式的日期输入

时间:2017-08-10 13:16:59

标签: java java-8

我使用此代码格式化格式化的文本字段以输入month&天:

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。

如何把魔术师赶走?

2 个答案:

答案 0 :(得分: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 .10':无法从TemporalAccessor获取MonthDay:{MonthOfYear = 13,DayOfMonth = 10},ISO类型为java.time.format.Parsed < / p>      

md.toString():null

答案 1 :(得分:0)

您需要使用SimpleDateFormat作为参数调用false的{​​{3}}方法,以便将用于解析的基础日历设置为非宽松。

非宽松日历将拒绝不在此字段预期范围内的字段值,而不是接受它们并修改其他字段以理解它们:在您的情况下,月份已翻转12并达到1,虽然年份增加了1,可能达到了1971年,而不是1970年的默认时间。

来自setLenient

  

从宽

     

Calendar有两种解释日历字段的模式,lenient和non-lenient。当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。当日历重新计算get()返回的日历字段值时,所有日历字段都会进行规范化。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。

     

当Calendar处于非宽松模式时,如果日历字段中存在任何不一致,则会抛出异常。例如,GregorianCalendar总是生成介于1和月长之间的DAY_OF_MONTH值。如果已设置任何超出范围的字段值,则非宽松的GregorianCalendar会在计算其时间或日历字段值时抛出异常。