日期转换格式时,报了无法解析异常。

在做生日转换的时候,报错了。不知道是什么原因。正常输入 的值啊。。

img

img

因为birth的时间格式(20210906)和simpledateformat中的格式(yyyy-MM-dd)不一致,可以改成yyyyMMdd。

因为你时间格式不对啊
20210906
yyyyMMdd

输入 2021-09-06

img


这格式不对还不够明显吗

生日时间格式和你的format不匹配

package cn.hutool.core.date;

img

用simpledateformat转时间格式,simpledateformat参数必须对应时间格式

img

格式不一样

记住这个原则,能省很多事。
任何开发语音,要存储时间、传输时间,都用整数时间戳,不要用字符串或自定义什么格式。
时间只有在展现时,才展现成具体年月日时分秒。

写个通用点的函数就好了,原理就是通过正则判断一下字符串是哪种格式,然后再尝试转换。如果对你有用,点一下采纳哦


import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateUtils {
public static final String DATE_BASE_REGEX = "\\d{4}-\\d{1,2}-\\d{1,2}";
    public static final String SEPARATOR_REGEX = "(T?|\\s*)";

    public static final String DATE_REGEX = "^\\s*" + DATE_BASE_REGEX + "\\s*$";
    public static final String DATE_H_REGEX = "^\\s*" + DATE_BASE_REGEX + SEPARATOR_REGEX + "\\d\\d\\s*$";
    public static final String DATE_HM_REGEX = "^\\s*" + DATE_BASE_REGEX + SEPARATOR_REGEX + "\\d{1,2}:\\dd{1,2}\\s*$";
    public static final String DATE_HMS_REGEX = "^\\s*" + DATE_BASE_REGEX + SEPARATOR_REGEX + "\\d{1,2}:\\d{1,2}:\\d{1,2}\\s*$";
    public static final String DATE_HMS_M_REGEX = "^\\s*" + DATE_BASE_REGEX + SEPARATOR_REGEX + "\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}\\s*$";

    private enum DATE_FORMAT_ENUM {

        DATE(Pattern.compile(DATE_REGEX), "yyyy-M-d"),
        DATE_H(Pattern.compile(DATE_H_REGEX), "yyyy-M-d H"),
        DATE_HM(Pattern.compile(DATE_HM_REGEX), "yyyy-M-d H:m"),
        DATE_HMS(Pattern.compile(DATE_HMS_REGEX), "yyyy-M-d H:m:s"),
        DATE_HMS_M(Pattern.compile(DATE_HMS_M_REGEX), "yyyy-M-d H:m:s.SSS");

        private Pattern pattern;
        private String format;

        DATE_FORMAT_ENUM(Pattern pattern, String format) {
            this.pattern = pattern;
            this.format = format;
        }

        static Date formatDate(String timeString) throws Exception {
            timeString = prepare(timeString);
            for (DATE_FORMAT_ENUM formatEnum : values()) {
                Matcher matcher = formatEnum.pattern.matcher(timeString);
                if (matcher.find()) {
                    SimpleDateFormat sdf = new SimpleDateFormat(formatEnum.format);
                    return sdf.parse(timeString);
                }
            }
            throw new Exception("Unparseable date: " + timeString);
        }

        private static String prepare(String timeString) {
            String s = null;
            if (!StringUtils.isEmpty(timeString)) {
                if (timeString.contains("-")) {
                    s = timeString;
                } else if (timeString.contains("/")) {
                    s = timeString.replaceAll("[/]", "-");
                } else {
                    s = timeString.substring(0, 4) + "-" + timeString.substring(4, 6) + "-" + timeString.substring(6);
                }
                int dotStart = s.indexOf(".") + 1;
                boolean hasDot = dotStart > 0;
                int msLength = dotStart + 3;
                int overMsLength = s.length() - msLength;
                int lessMsLength = msLength - s.length();

                if (hasDot && overMsLength >= 0) {
                    return s.substring(0, s.length() - overMsLength);
                } else if (hasDot && lessMsLength >= 0) {
                    for (int i = 0; i < lessMsLength; i++) {
                        s += "0";
                    }
                    return s;
                }

                if (hasDot) {
                    s += ".000";
                }
            }

            return s;
        }
    }

public static Date toDate(String timeString) throws Exception {
        if (StringUtils.isEmpty(timeString)) {
            return null;
        }
        return DATE_FORMAT_ENUM.formatDate(timeString);
    }
}