有时在处理一些日期类型的数据时,往往由于不清楚具体是什么类型的格式,导致无法正常的转为Date类型的数据,此处的目的在于写一个能识别常见的一些日期格式,并将其转为Date类型

常见的日期类型格式:

  • 20211112(没有分隔符的年月日)
  • 2021-11-12(- 分隔符的年月日)
  • 2021/11/12(/分隔符的年月日)
  • 2021.11.12(.分隔符的年月日)
  • 2021年11月12日(中文年月日)
  • 2021년11월12일(韩语的年月日)
  • 20211112214532(没有任意分隔符,时间具体到秒)
  • 202111122145(没有任意分隔符,时间具体到分钟)
  • 20211112 22:45:32(日期没有分隔符)
  • 2021.11.12 22:45:32 (日期分割符为 .)
  • 2021-12-21 23:10:33(常见的yyyy-MM-dd HH:mm:ss)
  • 2021/12/4(日为1位数)
  • 2021/5/31(月份为1位数)
  • 2021/5/3(月份为1位数、日为1位数)
  • 2021/5/31 1:25(月份为1位数,时为1位数)
  • 2021/5/31 1:2(月份为1位数,时、分为1位数)
  • 2021/5/31 12:25(月份为1位数,只有小时和分,没有秒)
  • 2021/5/31 12:5(月份为1位数、分钟数为1位数)
  • 2021-11-28T22:33:31+0800(UTC时间格式)
  • 1638702321(10位秒时间戳)
  • 1638702321200(13位毫秒时间戳)

具体实现

详见 toDate() 方法

package top.wys.utils.convert;
/**
 * Created by 郑明亮 on 2021/12/3 23:55.
 */

import org.jetbrains.annotations.NotNull;
import top.wys.utils.DateUtils;
import top.wys.utils.NumberUtils;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;

/**
 * <ol>
 *  2021/12/3 23:55 <br>
 *
 * </ol>
 *
 * @author 郑明亮
 * @version 1.0
 */
public class ConvertUtils {

    /**
     * 转换为字符串类型的数据
     *
     * @param obj 要转换类型的对象
     * @return
     */
    public static String toString(Object obj) {
        return toString(obj, null);
    }

    /**
     * 转换为字符串
     *
     * @param obj          要转换为字符串的对象
     * @param defaultValue 当obj为null时,默认返回的值
     * @return
     */
    public static String toString(Object obj, String defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        return obj.toString();
    }

    /**
     * 转为布尔类型
     *
     * @param obj
     * @return
     */
    public static boolean toBoolean(Object obj) {
        return toBoolean(obj, null);
    }

    /**
     * 转为布尔类型
     *
     * @param obj       要转换类型的对象
     * @param trueValue 该对象和obj一样时,则返回true
     * @return
     */
    public static boolean toBoolean(Object obj, Object trueValue) {
        if (obj == null) {
            return false;
        }
        if (obj instanceof Boolean) {
            return Boolean.TRUE.equals(obj);
        }
        if (trueValue != null) {
            return Objects.equals(obj, trueValue);
        }

        if (obj instanceof CharSequence) {
            return Boolean.parseBoolean(obj.toString());
        }
        return false;
    }


    public static Integer toInteger(Object obj) {
        return toInteger(obj, null);
    }


    public static int toInt(Object obj) {
        if (obj == null) {
            return 0;
        }
        if (obj instanceof Number) {
            return ((Number) obj).intValue();
        }
        String strValue = obj.toString();
        if (obj instanceof CharSequence) {

            try {
                return new BigDecimal(strValue).intValue();
            } catch (NumberFormatException e) {
                strValue = getNumberString(strValue);
                return new BigDecimal(strValue).intValue();
            }
        }

        return Integer.parseInt(strValue);
    }

    @NotNull
    private static String getNumberString(String strValue) {
        char lastChar = strValue.charAt(strValue.length() - 1);
        if(NumberUtils.isNotNumber(lastChar)){
            strValue = strValue.substring(0, strValue.length() - 1);
        }else if(strValue.charAt(0) == '.'){
            strValue = "0" + strValue;
        }
        return strValue;
    }

    /**
     * 转为Integer
     *
     * @param obj
     * @param defaultValue 默认值
     * @return
     */
    public static Integer toInteger(Object obj, Integer defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        try {
            return toInt(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    public static Double toDouble(Object obj) {
        return toDouble(obj, null);
    }


    public static double toDoubleValue(Object obj) {
        if (obj == null) {
            return 0D;
        }
        if (obj instanceof Number) {
            return ((Number) obj).doubleValue();
        }
        String strValue = obj.toString();
        if (obj instanceof CharSequence) {
            try {
                return new BigDecimal(strValue).doubleValue();
            } catch (NumberFormatException e) {
                strValue = getNumberString(strValue);
                return new BigDecimal(strValue).intValue();
            }
        }

        return Double.parseDouble(strValue);
    }

    /**
     * 转为Double
     *
     * @param obj
     * @param defaultValue 默认值
     * @return
     */
    public static Double toDouble(Object obj, Double defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        try {
            return toDoubleValue(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }


    public static Long toLong(Object obj) {
        return toLong(obj, null);
    }


    public static long toLongValue(Object obj) {
        if (obj == null) {
            return 0L;
        }
        if (obj instanceof Number) {
            return ((Number) obj).longValue();
        }

        String strValue = obj.toString();
        if (obj instanceof CharSequence) {
            try {
                return new BigDecimal(strValue).longValue();
            } catch (NumberFormatException e) {
                strValue = getNumberString(strValue);
                return new BigDecimal(strValue).longValue();
            }
        }

        long number = Long.parseLong(strValue);
        return number;
    }

    /**
     * 转为Long
     *
     * @param obj
     * @param defaultValue 默认值
     * @return
     */
    public static Long toLong(Object obj, Long defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        try {
            return toLongValue(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    /**
     * 转为BigDecimal
     *
     * @param obj
     * @return
     */
    public static BigDecimal toBigDecimal(Object obj) {
        return toBigDecimal(obj,null);
    }



    /**
     * 转为BigDecimal
     *
     * @param obj
     * @param defaultValue 默认值
     * @return
     */
    public static BigDecimal toBigDecimal(Object obj, BigDecimal defaultValue) {
        if (obj == null) {
            return defaultValue;
        }
        try {
            return new BigDecimal(obj.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;
    }

    /**
     * 转换为Date类型
     * @param obj
     * @return
     */
    public static Date toDate(Object obj){
        return toDate(obj,null);
    }

    public static Date toDate(Object obj,Date defaultValue){
        if (obj == null) {
            return defaultValue;
        }

        String strValue = obj.toString();
        int strLength = strValue.length();
        Date date = new Date();
        if(obj instanceof Number){
            int length = strValue.length();
            if(length == 10){
                date.setTime(toLong(strValue + "000"));
            }else {
                date.setTime(((Number) obj).longValue());
            }
            return date;
        }
        if(obj instanceof Date){
            return (Date) obj;
        }

        if(obj instanceof java.sql.Date){
            date.setTime(((java.sql.Date) obj).getTime());
            return date;
        }

        char[] chars = strValue.toCharArray();
        // 判断是否是时间戳
        if (strLength == 10 && NumberUtils.isNumber(chars)) {
            date.setTime(toLong(strValue + "000"));
            return date;
        }else if(strLength == 13 && NumberUtils.isNumber(chars)){
            date.setTime(toLong(strValue));
            return date;
        }
        // 计算pattern和日期对应配置的偏移量
        // 如:yyyy-MM-dd 对于2021-5-2 偏移量为-2, 对于2021-5-12 偏移量为-1 ,对于2021-05-12 偏移量为0
        int offset = 0;
        StringBuilder pattern = new StringBuilder();
        // 2021-11-12   2021/11/12
        if (/*(chars[4] == chars[7] && NumberUtils.isNotNumber(chars[4])) ||*/ (NumberUtils.isNotNumber(chars[4]) && NumberUtils.isNotNumber(chars[7]))) {
            String split1 = toString(chars[4]);
            String split2 = toString(chars[7]);
            pattern.append("yyyy").append(split1).append("MM").append(split2).append("dd");
        // 2021/5/2
        }else if ((NumberUtils.isNotNumber(chars[4]) && NumberUtils.isNotNumber(chars[6]))) {
            String split1 = toString(chars[4]);
            String split2 = toString(chars[6]);
            pattern.append("yyyy").append(split1).append("MM").append(split2).append("dd");

            if(strLength > 8){
                // 如果第8个字符是数字则说明日期为两位数,否则为一位数
                if(NumberUtils.isNumber(chars[8])){
                    offset = -1;
                }else {
                    offset = -2;
                }
            }

        // 5/11/2021
        } else if((NumberUtils.isNotNumber(chars[1]) && NumberUtils.isNotNumber(chars[4]))){
            String dateSplit1 = toString(chars[1]);
            String dateSplit2 = toString(chars[4]);
            pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
            offset = -1;
            // 12-5-2021
        } else if((NumberUtils.isNotNumber(chars[2]) && NumberUtils.isNotNumber(chars[4]))){
            String dateSplit1 = toString(chars[2]);
            String dateSplit2 = toString(chars[4]);
            pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
            offset = -1;
        } else if(/*(chars[3] == chars[6]  && NumberUtils.isNotNumber(chars[3])) ||*/ (NumberUtils.isNotNumber(chars[3]) && NumberUtils.isNotNumber(chars[6]))){
            String dateSplit1 = toString(chars[3]);
            String dateSplit2 = toString(chars[6]);
            pattern.append("dd").append(dateSplit1).append("MM").append(dateSplit2).append("yyyy");
        } else {
            pattern.append("yyyyMMdd");
        }

        int patternLength = pattern.length();
        if(patternLength >= strValue.trim().length()){
            return DateUtils.getDateByGiven(strValue, pattern.toString());
        }
        int nextPosition = patternLength + offset;
        if (chars[nextPosition] == ' ') {
            pattern.append(" ");
        }else if(chars[nextPosition] == 'T'){
            pattern.append("'T'");
            offset -= 2;
        }else if(NumberUtils.isNotNumber(chars[nextPosition])){
            pattern.append(toString(chars[nextPosition]));
        }

        patternLength = pattern.length();
        if(patternLength >= strValue.trim().length()){
            return DateUtils.getDateByGiven(strValue, pattern.toString());
        }

        nextPosition = patternLength + offset;
        if (strLength >= nextPosition + 6) {

            if (chars[nextPosition + 2] == chars[nextPosition + 5] && (!NumberUtils.isNumber(chars[nextPosition + 2]))) {
               pattern.append("HH").append(toString(chars[nextPosition + 2])).append("mm").append(toString(chars[nextPosition + 5])).append("ss");
            }else {
                pattern.append("HHmmss");
            }
        }else if(strLength >=nextPosition + 3){
            // 5:42 或12:5 或者5:3
            if(NumberUtils.isNotNumber(chars[nextPosition + 1]) || NumberUtils.isNotNumber(chars[nextPosition + 2])){
                pattern.append("HH:mm");
            }else{
                pattern.append("HHmm");
            }

        } else {
            pattern.append("HHmmss");
        }

        patternLength = pattern.length();
        if(patternLength >= strLength){
            return DateUtils.getDateByGiven(strValue, pattern.toString());
        }
        if (chars[patternLength] == '.') {
            pattern.append(".SSS");
        }else if(chars[patternLength] == '+' || chars[patternLength] == '-'){
            pattern.append("Z");
        }

        patternLength = pattern.length();
        if(patternLength >= strLength){
            return DateUtils.getDateByGiven(strValue, pattern.toString());
        }

        if(chars[patternLength] == '+' || chars[patternLength] == '-'){
            pattern.append("Z");
        }
        return DateUtils.getDateByGiven(strValue, pattern.toString());
    }

}

涉及到的NumberUtils.java

/**
     * 是否是数字
     * @param ch 字符
     * @return 是数字返回true,否则返回false
     */
    public static boolean isNumber(char ch){
        return ch >= '0' && ch <= '9';
    }

    /**
     * 是否是数字
     * @param str 字符
     * @return 是数字返回true,否则返回false
     */
    public static boolean isNumber(String str){
       return isNumber(str.toCharArray());
    }

    /**
     * 是否是数字
     * @param chars 字符
     * @return 是数字返回true,否则返回false
     */
    public static boolean isNumber(char[] chars){
        for (char ch : chars) {
            if(isNotNumber(ch)){
                return false;
            }
        }
        return true;
    }

    /**
     * 是否不是数字
     * @param ch 字符
     * @return 不是数字返回true,否则返回false
     */
    public static boolean isNotNumber(char ch){
        return !isNumber(ch);
    }
    /**
     * 是否不是数字
     * @param str 字符
     * @return 不是数字返回true,否则返回false
     */
    public static boolean isNotNumber(String str){
        return !isNumber(str);
    }

    

单元测试

 @Test
    public void toDate() {
        System.out.println("ConvertUtils.toDate(\"20211112\",null) = " + ConvertUtils.toDate("20211112", null));
        System.out.println("ConvertUtils.toDate(\"2021-11-12\",null) = " + ConvertUtils.toDate("2021-11-12", null));
        System.out.println("ConvertUtils.toDate(\"2021/11/12\",null) = " + ConvertUtils.toDate("2021/11/12", null));
        System.out.println("ConvertUtils.toDate(\"2021年11月12日\",null) = " + ConvertUtils.toDate("2021年11月12日", null));
        System.out.println("ConvertUtils.toDate(\"2021년11월12일\",null) = " + ConvertUtils.toDate("2021년11월12일"));//
        System.out.println("ConvertUtils.toDate(\"20211112214532\",null) = " + ConvertUtils.toDate("20211112214532", null));
        System.out.println("ConvertUtils.toDate(\"20211112 22:45:32\",null) = " + ConvertUtils.toDate("20211112 22:45:32", null));
        System.out.println("ConvertUtils.toDate(\"2021.11.12 22:45:32\",null) = " + ConvertUtils.toDate("2021.11.12 22:45:32", null));
        System.out.println("ConvertUtils.toDate(\"2021-12-21 23:10:33\") = " + ConvertUtils.toDate("2021-12-21 23:10:33"));
        System.out.println("ConvertUtils.toDate(\"2021/12/4\") = " + ConvertUtils.toDate("2021/12/4"));
        System.out.println("ConvertUtils.toDate(\"2021/5/31\") = " + ConvertUtils.toDate("2021/5/31"));
        System.out.println("ConvertUtils.toDate(\"2021/5/3\") = " + ConvertUtils.toDate("2021/5/3"));
        System.out.println("ConvertUtils.toDate(\"2021/12/4 1:25\") = " + ConvertUtils.toDate("2021/5/31 1:25"));
        System.out.println("ConvertUtils.toDate(\"2021/12/4 1:2\") = " + ConvertUtils.toDate("2021/5/31 1:2"));
        System.out.println("ConvertUtils.toDate(\"2021/12/4 12:25\") = " + ConvertUtils.toDate("2021/5/31 12:25"));
        System.out.println("ConvertUtils.toDate(\"2021/12/4 12:5\") = " + ConvertUtils.toDate("2021/5/31 12:5"));
        System.out.println("ConvertUtils.toDate(\"2021-11-28T22:33:31+0800\") = " + ConvertUtils.toDate("2021-11-28T22:33:31+0800"));

        System.out.println("ConvertUtils.toDate(\"202111122145\") = " + ConvertUtils.toDate("202111122145"));
        System.out.println("ConvertUtils.toDate(\"1638702321\") = " + ConvertUtils.toDate("1638702321"));
        System.out.println("ConvertUtils.toDate(\"1638702321200\") = " + ConvertUtils.toDate("1638702321200"));
    }

运行结果:

ConvertUtils.toDate("20211112",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021-11-12",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021/11/12",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021年11月12日",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("2021년11월12일",null) = Fri Nov 12 00:00:00 CST 2021
ConvertUtils.toDate("20211112214532",null) = Fri Nov 12 21:45:32 CST 2021
ConvertUtils.toDate("20211112 22:45:32",null) = Fri Nov 12 22:45:32 CST 2021
ConvertUtils.toDate("2021.11.12 22:45:32",null) = Fri Nov 12 22:45:32 CST 2021
ConvertUtils.toDate("2021-12-21 23:10:33") = Tue Dec 21 23:10:33 CST 2021
ConvertUtils.toDate("2021/12/4") = Sat Dec 04 00:00:00 CST 2021
ConvertUtils.toDate("2021/5/31") = Mon May 31 00:00:00 CST 2021
ConvertUtils.toDate("2021/5/3") = Mon May 03 00:00:00 CST 2021
ConvertUtils.toDate("2021/12/4 1:25") = Mon May 31 01:25:00 CST 2021
ConvertUtils.toDate("2021/12/4 1:2") = Mon May 31 01:02:00 CST 2021
ConvertUtils.toDate("2021/12/4 12:25") = Mon May 31 12:25:00 CST 2021
ConvertUtils.toDate("2021/12/4 12:5") = Mon May 31 12:05:00 CST 2021
ConvertUtils.toDate("2021-11-28T22:33:31+0800") = Sun Nov 28 22:33:31 CST 2021
ConvertUtils.toDate("202111122145") = Fri Nov 12 21:45:00 CST 2021
ConvertUtils.toDate("1638702321") = Sun Dec 05 19:05:21 CST 2021
ConvertUtils.toDate("1638702321200") = Sun Dec 05 19:05:21 CST 2021

项目依赖

使用maven依赖

<!-- https://mvnrepository.com/artifact/top.wuyongshi/ZmlTools -->
<dependency>
    <groupId>top.wuyongshi</groupId>
    <artifactId>ZmlTools</artifactId>
    <version>1.3.0</version>
</dependency>

使用gradle依赖

// https://mvnrepository.com/artifact/top.wuyongshi/ZmlTools
implementation 'top.wuyongshi:ZmlTools:1.3.0'

Q.E.D.


寻门而入,破门而出