Java8格式化日期输入

Java8格式化日期输入,java,java-8,Java,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.currentTime

我使用此代码格式化格式化文本字段,以输入月份和日期:

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,magican会在此行后将其更改为1.10:

DateOfAdding = datumTextField.getText();
所以DateOfAdding值是1.10


如何关闭magican?

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

非宽松日历将拒绝不在此字段的预期范围内的字段值,而不是接受这些值并修改其他字段以使其有意义:在您的情况下,月份滚动了12个月,达到了1,而年份增加了1,可能达到了1971年,而不是1970年时的默认值

从:

宽大

Calendar有两种解释日历字段的模式,即宽松模式和非宽松模式。当日历处于宽松模式时,它接受的日历字段值的范围比它产生的范围更广。当日历重新计算get()返回的日历字段值时,所有日历字段都将被规范化。例如,宽大的GregorianCalendar将月份==1月,月中日==32解释为2月1日

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

tl;博士 捕获无效的输入

java.time.MonthDay
现代方法使用java.time类,而不是问题中看到的麻烦的遗留类

在java.time类中,这正是您所需要的

我建议收集两个不同数字的输入

MonthDay md = MonthDay.of( x , y ) ;
如果您坚持,您可以将输入收集为字符串和字符串的组合。如果是这样,我建议您和您的用户使用标准格式:
--MM-DD

MonthDay md = MonthDay.parse( "--12-31" ) ;
或者使用定义一个模式

用于检测无效输入的陷阱

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 ) ;
} 
看这个

无效输入:13.10

e:java.time.format.DateTimeParseException:无法解析文本“13.10”:无法从TemporalAccessor获取MonthDay:{MonthOfYear=13,DayOfMonth=10},类型为java.time.format.parsed的ISO

md.toString():null


魔术师。。。?看起来该字段只是返回了与有效日期最接近的近似值。请更清楚地描述问题所在。请发布一个。然后描述您采取的确切步骤以及程序显示的确切行为。如果需要,可以用屏幕截图来补充说明。仅供参考,您使用的是现在遗留下来的麻烦的旧类,被java.time类取代。是的,比我的解决方案更好,特别是因为问题有标签
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM.dd" ) ;
MonthDay md = MonthDay.parse( input , f ) ;
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 ) ;
}