Skip to main content

智能日期识别工具类

作草分茶About 2 min

智能日期识别工具类

我们在开发中会经常使用到时间类,可能是 Date 也可能是 LocalDate 或者 LocalDateTime,但是字符串也有很多格式,常见的格式如下:

  • 2022-03-08

  • 2022/03/08

  • 2022-03-08 21:28:00

  • 2022-03-08T21:28:00

  • 2022-03-08T21:28:00.Z

那么怎么才能简单无脑的将这些格式的字符串转换为我们代码能用的类呢,其实这些格式都是有特征的,整体思路是根据这些特征进行特殊处理,建议使用时适当更改实现,以适配更多的场景。下面是代码实现:

参考

此处用到了另一个时间转换工具类,见 DateConvertor

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 智能日期识别工具
 *
 * @author qiqiang
 */
@SuppressWarnings("unused")
public class SmartDateUtils {

    /**
     * 日期分隔符
     */
    private static final String DATE_SPLIT = "/";
    /**
     * 毫秒分隔符
     */
    private static final String MILL_SPLIT = ".";
    /**
     * 日期时间分隔符
     */
    private static final char DATETIME_SPLIT = 'T';
    /**
     * 区域
     */
    private static final String ZONE_SPLIT = "Z";
    /**
     * 日期长度限制
     */
    private static final int DATE_LIMIT = 10;


    /**
     * 文本得到LocalDate
     *
     * @param text 文本
     * @return 文本
     */
    public static LocalDate toLocalDate(final String text) {
        String string = text;
        if (text.length() > DATE_LIMIT) {
            string = text.substring(0, 10);
        }
        if (text.contains(DATE_SPLIT)) {
            return DateConvertor.parseToLocalDate(string, "yyyy/MM/dd");
        }
        return DateConvertor.parseToLocalDate(string, DateConvertor.Pattern.USUAL_DATE);
    }

    /**
     * 文本得到Date
     *
     * @param text 文本
     * @return Date
     */
    public static Date toDate(final String text) {
        if (text.length() > DATE_LIMIT) {
            return DateConvertor.localDateTimeToDate(toLocalDateTime(text));
        } else {
            return DateConvertor.localDateToDate(toLocalDate(text));
        }
    }

    /**
     * 文本得到LocalDateTime
     *
     * @param text 文本
     * @return LocalDateTime
     */
    public static LocalDateTime toLocalDateTime(final String text) {
        String string = text;
        // 处理带 "." 的情况
        if (text.contains(MILL_SPLIT)) {
            string = text.split("\\.", -1)[0];
        }
        if (string.length() > DATE_LIMIT && string.charAt(DATE_LIMIT) == DATETIME_SPLIT) {
            // 2020-02-02T00:00:00Z
            if (string.endsWith(ZONE_SPLIT)) {
                return LocalDateTime.ofInstant(Instant.parse(string), ZoneOffset.UTC);
            } else {
                // 2020-02-02T00:00:00
                return LocalDateTime.parse(string, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            }
        }
        // 2020-02-02 00:00:00
        return DateConvertor.parseToLocalDateTime(string, DateConvertor.Pattern.USUAL_DATE_TIME);
    }
}