问题描述
public class SimpleDateFormatParseTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse("2023-11-35");
System.out.println(sdf.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
如上这段代码看似没有问题,但是看运行结果就能发现问题
发现2023-11-35这个日期其实并不存在,但是解析后竟然得到2023-12-05,而想要的效果是直接报错提示。
问题原因
SimpleDateFormat有个setLenient方法,这个方法用于设置 SimpleDateFormat
实例的解析模式是否为宽松(lenient)模式
public void setLenient(boolean lenient)
lenient
:一个布尔值。如果为true
,则启用宽松模式;如果为false
,则启用严格模式。
宽松模式(Lenient Mode)
在宽松模式下,SimpleDateFormat
会对输入的日期和时间进行更灵活的解析。例如:
- 月份可以从 0 到 12(0 和 12 通常会被解释为上一年的 12 月和下一年的 1 月)。
- 日期可以从 1 到 31(即使月份只有 30 天或 28/29 天)。
- 时间可以超过 24 小时(例如,25:00 会被解释为第二天的 1:00)。
严格模式(Strict Mode)
在严格模式下,SimpleDateFormat
会严格按照日期和时间的规则进行解析。例如:
- 月份必须在 1 到 12 之间。
- 日期必须在月份的有效范围内。
- 时间必须在 0 到 23 小时之间。
问题解决
public class SimpleDateFormatParseTest {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
try {
Date date = sdf.parse("2023-11-35");
System.out.println(sdf.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
设置为严格模式后就会严格按照日期和时间的规则进行解析,不符合则报异常如下
java.text.ParseException: Unparseable date: "2023-11-35"
at java.base/java.text.DateFormat.parse(DateFormat.java:399)
at SimpleDateFormatParseTest.main(SimpleDateFormatParseTest.java:10)
总结
setLenient
方法允许你控制 SimpleDateFormat
在解析日期和时间时的严格程度。根据具体需求选择适当的模式,以确保日期和时间的正确性和一致性。