SimpleDateFormat宽松模式和严格模式

问题描述

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 在解析日期和时间时的严格程度。根据具体需求选择适当的模式,以确保日期和时间的正确性和一致性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen2017sheng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值