我使用此代码格式化格式化的文本字段以输入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。
如何把魔术师赶走?
答案 0 :(得分:1)
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会在计算其时间或日历字段值时抛出异常。