正在尝试使用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
非常感谢任何解释!
答案 0 :(得分:1)
让那些想要答案的读者拼出来:
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);
}
}
答案 1 :(得分:-1)
非常感谢任何解释!
我们走了: 解释很简单:
这种格式" MM / dd / yyyy" 非常简单,对象是什么,该对象期望解析月份日信息。
所以你给这个" 2023/03/22" ,那么这里错的第一个是飞蛾(应该在1到12之间)持有值2023,解析器将其解释为之后的月份12 + 2011。
第03天没问题,第22年就是指克里斯托斯出生后的第22年。
所以您的结果日期是
有效数据加上奇怪的偏移量,即
12/03/0022 + 2011个月。
现在2011个月是相同的:167年零7个月 所以我们做数学:
22年的12 03年加上167年7个月......然后你得到了
Fri Jul 03 00:00:00 CET 190
解决方案:
format.setLenient(boolean);
检查doc以查看在这种情况下会抛出什么异常....