我需要将用户输入验证为有效日期。用户可以输入dd / mm / yyyy或mm / yyyy(两者都有效)
验证我正在做的事
try{
GregorianCalendar cal = new GregorianCalendar();
cal.setLenient(false);
String []userDate = uDate.split("/");
if(userDate.length == 3){
cal.set(Calendar.YEAR, Integer.parseInt(userDate[2]));
cal.set(Calendar.MONTH, Integer.parseInt(userDate[1]));
cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(userDate[0]));
cal.getTime();
}else if(userDate.length == 2){
cal.set(Calendar.YEAR, Integer.parseInt(userDate[1]));
cal.set(Calendar.MONTH, Integer.parseInt(userDate[0]));
cal.getTime();
}else{
// invalid date
}
}catch(Exception e){
//Invalid date
}
作为GregorianCalendar开始的0月30日,2009年1月30日或12月12日给出了错误。
任何建议如何解决这个问题。
答案 0 :(得分:11)
使用SimpleDateformat
。如果解析失败则抛出ParseException
:
private Date getDate(String text) throws java.text.ParseException {
try {
// try the day format first
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
df.setLenient(false);
return df.parse(text);
} catch (ParseException e) {
// fall back on the month format
SimpleDateFormat df = new SimpleDateFormat("MM/yyyy");
df.setLenient(false);
return df.parse(text);
}
}
答案 1 :(得分:3)
使用SimpleDateFormat
验证Date
和setLenient
验证false
。
答案 2 :(得分:1)
使用try - catch
来抓取DateTimeParseException
和LocalDate.parse
在 java.time 类中引发的YearMonth.parse
。
现代方法使用 java.time 类。
YearMonth
只有一个月没有一个月的月份,请使用YearMonth
课程。
如果可能,让您的用户使用标准ISO 8601格式进行数据输入:YYYY-MM
。在解析/生成字符串时, java.time 类默认使用标准格式。
YearMonth ym = YearMonth.parse( "2018-01" ) ;
如果不可能,请指定格式设置模式。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = YearMonth.parse( "01/2018" , f ) ;
要测试无效输入,请捕获异常。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = null ;
try{
ym = YearMonth.parse( "01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
// Handle faulty input
…
}
LocalDate
对于仅限日期的值,如果没有时间段且没有时区,请使用LocalDate
类。
同样,如果可能,使用标准ISO 8601格式进行数据输入:YYYY-MM-DD
。
LocalDate ld = LocalDate.parse( "2018-01-23" ) ;
如果没有,请指定格式化模式和异常陷阱,如上所示。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = null ;
try{
ld = LocalDate.parse( "23/01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
// Handle faulty input
…
}
如果输入可以是仅日期或年月,则测试输入的长度以确定哪个是。
int length = input.length() ;
switch ( length ) {
case 7 :
… // Process as year-month using code seen above.
case 10 :
… // Process as date-only using code seen above.
default:
… // ERROR, unexpected input.
}
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。