线上关于SimpleDateFormat踩坑记录

问题描述

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class TestSimpleDateFormat {
    public static void main(String[] args) {
        System.out.println(isValidDate("0229", "MMdd"));//false
        System.out.println(isValidDate("0228", "MMdd"));//true
        System.out.println(isValidDate("20230229", "yyyyMMdd"));//false
        System.out.println(isValidDate("20240229", "yyyyMMdd"));//true
    }

    public static boolean isValidDate(String str, String formatStr) {
        boolean convertSuccess = true;
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        try {
            // 严格模式
            format.setLenient(false);
            format.parse(str);
        } catch (ParseException e) {
            convertSuccess = false;
            e.printStackTrace();
        }
        return convertSuccess;
    }
}

报错信息为

java.text.ParseException: Unparseable date: "0229"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at com.imooc.TestSimpleDateFormat.isValidDate(TestSimpleDateFormat.java:21)
	at com.imooc.TestSimpleDateFormat.main(TestSimpleDateFormat.java:8)

如果当前年份为闰年,日期为2月29号,但是我们要校验的格式不包含年份,那么 SimpleDateFormat 就识别不了闰年,就会将 2月29 当作一个无效日期。

解决方法

  1. 去掉严格模式,这样 SimpleDateFormat 就不校验日期是否真正有效了,只校验格式。
  2. 加上年份,这个 SimpleDateFormat 就可以识别闰年了
posted @ 2024-03-15 22:34  strongmore  阅读(11)  评论(0编辑  收藏  举报