[英]SimpleDateFormat.parse not detecting incorrect date
正在尝试SimpleDateFormat。 有一件事我不明白:为什么下面的返回ok
?
String pattern = "MM/dd/yyyy";
SimpleDateFormat format = new SimpleDateFormat(pattern);
String input = "2023/03/22";
Date d = null;
try {
d = format.parse(input);
} catch (ParseException e) {
System.out.println("nok");
}
System.out.println("ok");
返回的日期也很荒谬: Fri Jul 03 00:00:00 CET 190
任何解释,不胜感激!
让我们为那些想要答案中所有内容的读者说明一下:
format.setLenient(false)是您所需要的。
这是您可能的操作方式。 我同意AxelH:您应该使用JDK8, java.time
包和LocalTime
:
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class DateFormatTest {
@Test(expected = ParseException.class)
public void testSetLenient_IncorrectDateInput() throws ParseException {
// setup
String input = "2023/03/22";
String pattern = "MM/dd/yyyy";
DateFormat format = new SimpleDateFormat(pattern);
format.setLenient(false);
// exercise and assert
format.parse(input);
}
}
任何解释,不胜感激!
我们开始:解释很简单:
该格式“ MM / dd / yyyy”非常简单,即对象是如何解析一个月日年份信息。
因此,您给出的是“ 2023/03/22” ,那么这里的第一个错误是蛾(应在1到12之间)持有值2023,解析器将其解释为月份12 +在那之后的2011年。
第三天还可以,而22年恰好意味着克里斯托斯出生后的22年。
因此,您得出的日期是
有效数据加上怪异的偏移量,即
12/03/0022 + 2011个月。
现在的2011个月等于:167年零7个月,所以我们做一下数学运算:
每年12月3日22加上167年零7个月...
星期五七月03 00:00:00欧洲中部时间190
解决方案:
format.setLenient(boolean);
检查文档以查看在这种情况下将引发什么异常...。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.