SimpleDateFormat 解析没有给出我预期的响应
SimpleDateFormat parse not giving the response I expected
我有这个Javaclass:
package TestPackage;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class TestSimpleDateFormat {
private static final String DATE_FORMAT = "dd/MM/yyyy";
private String dob;
public boolean isValidDate(String day, String month, String year) {
boolean isValid;
DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
formatter.setLenient(false);
try {
formatter.parse(extractDateOfBirthFrom(day, month, year));
isValid = true;
}
catch (ParseException e){
isValid = false;
}
return isValid;
}
private String extractDateOfBirthFrom(String day, String month, String year) {
String dob = day.concat("/").concat(month).concat("/").concat(year);
return dob;
}
}
当我 运行 在我的主体中进行以下操作时,我得到的日期验证响应值为 true
:
TestSimpleDateFormat testSimpleDate = new TestSimpleDateFormat();
System.out.println("Is date valid: " + testSimpleDate.isValidDate("01", "01", "81"));
因为我只传递了 yy 而不是当年的 yyyy,所以我预计验证会失败。是否可以仅强制检查 yyyy
?
问题是 yy 是正确的,因为 DateFormat 将作为有效年份,然后您需要添加其他验证,可能使用正则表达式来验证日期格式。
也许你可以试试:
try {
String dob = main.extractDateOfBirthFrom(day, month, year);
java.util.Date date = formatter.parse(dob);
isValid = true;
dob.matches("^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$") ? isValid = true : isValid = false;
}
catch (ParseException e){
isValid = false;
}
tl;博士
您询问了在解析表示日期的文本时如何检测错误输入。
try
{
LocalDate.parse(
"01/01/81" ,
DateTimeFormatter.ofPattern( "MM/dd/uuuu" )
)
}
catch ( DateTimeParseException e )
{
… handle faulty input
}
java.time.format.DateTimeParseException
:
if there's any way to force validation where the year is yyyy so if yy is used validation will fail.
作为 ,使用现代 java.time 类 多年前取代了可怕的遗留日期时间 类例如 Date
、Calendar
和 SimpleDateFormat
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
String input = "01/01/81" ; // Two-digit year does not match formatting pattern.
LocalDate ld = LocalDate.parse( input , f ) ;
该代码抛出异常:
java.time.format.DateTimeParseException: Text '01/01/81' could not be parsed at index 6
查看此代码 run live at IdeOne.com。
您可以捕获那个 DateTimeParseException
来检测和处理错误的输入。
我有这个Javaclass:
package TestPackage;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class TestSimpleDateFormat {
private static final String DATE_FORMAT = "dd/MM/yyyy";
private String dob;
public boolean isValidDate(String day, String month, String year) {
boolean isValid;
DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
formatter.setLenient(false);
try {
formatter.parse(extractDateOfBirthFrom(day, month, year));
isValid = true;
}
catch (ParseException e){
isValid = false;
}
return isValid;
}
private String extractDateOfBirthFrom(String day, String month, String year) {
String dob = day.concat("/").concat(month).concat("/").concat(year);
return dob;
}
}
当我 运行 在我的主体中进行以下操作时,我得到的日期验证响应值为 true
:
TestSimpleDateFormat testSimpleDate = new TestSimpleDateFormat();
System.out.println("Is date valid: " + testSimpleDate.isValidDate("01", "01", "81"));
因为我只传递了 yy 而不是当年的 yyyy,所以我预计验证会失败。是否可以仅强制检查 yyyy
?
问题是 yy 是正确的,因为 DateFormat 将作为有效年份,然后您需要添加其他验证,可能使用正则表达式来验证日期格式。
也许你可以试试:
try {
String dob = main.extractDateOfBirthFrom(day, month, year);
java.util.Date date = formatter.parse(dob);
isValid = true;
dob.matches("^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$") ? isValid = true : isValid = false;
}
catch (ParseException e){
isValid = false;
}
tl;博士
您询问了在解析表示日期的文本时如何检测错误输入。
try
{
LocalDate.parse(
"01/01/81" ,
DateTimeFormatter.ofPattern( "MM/dd/uuuu" )
)
}
catch ( DateTimeParseException e )
{
… handle faulty input
}
java.time.format.DateTimeParseException
if there's any way to force validation where the year is yyyy so if yy is used validation will fail.
作为 Date
、Calendar
和 SimpleDateFormat
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
String input = "01/01/81" ; // Two-digit year does not match formatting pattern.
LocalDate ld = LocalDate.parse( input , f ) ;
该代码抛出异常:
java.time.format.DateTimeParseException: Text '01/01/81' could not be parsed at index 6
查看此代码 run live at IdeOne.com。
您可以捕获那个 DateTimeParseException
来检测和处理错误的输入。