日期格式化

日期的格式化使用SimpleDateFormat。

/**
 * 日期工具类
 */
public final class DateUtils {

    private DateUtils() {}

    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
     * @param date 日期
     * @return str
     */
    public static String format(Date date) {
        return format(date, DATE_TIME);
    }

    /**
     * 按指定格式格式化日期
     * @param date 日期
     * @param pattern 格式
     * @return str
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return "";
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     * 将字符串转为日期
     * @param dateStr 日期字符串
     * @return date
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, DATE_TIME);
    }

    /**
     * 按照指定格式将字符串转为日期
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return date
     */
    public static Date parse(String dateStr, String pattern) {
        if (dateStr == null || dateStr.isEmpty()) {
            return null;
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        try {
            return new SimpleDateFormat(pattern).parse(dateStr);
        } catch (ParseException e) {
            // write log
            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(format(new Date()));
        System.out.println(parse("2016-12-01 10:00:00"));
    }
}

每次要进行日期格式化的时候,就新建一个SimpleDateFormat对象。 这种方式代价比较大。

将SimpleDateFormat改为static类型:

/**
 * 日期工具类
 */
public final class DateUtils {

    private DateUtils() {}

    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    private static SimpleDateFormat sdf = new SimpleDateFormat();

    private static SimpleDateFormat applyPattern(String pattern) {
        if (!sdf.toPattern().equals(pattern)) {
            sdf.applyPattern(pattern);
        }
        return sdf;
    }

    /**
     * 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
     * @param date 日期
     * @return str
     */
    public static String format(Date date) {
        return format(date, DATE_TIME);
    }

    /**
     * 按指定格式格式化日期
     * @param date 日期
     * @param pattern 格式
     * @return str
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return "";
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        return applyPattern(pattern).format(date);
    }

    /**
     * 将字符串转为日期
     * @param dateStr 日期字符串
     * @return date
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, DATE_TIME);
    }

    /**
     * 按照指定格式将字符串转为日期
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return date
     */
    public static Date parse(String dateStr, String pattern) {
        if (dateStr == null || dateStr.isEmpty()) {
            return null;
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        try {
            return applyPattern(pattern).parse(dateStr);
        } catch (ParseException e) {
            // write log
            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(format(new Date()));
        System.out.println(parse("2016-12-01 10:00:00"));
    }
}

这种方式大大减少了SimpleDateFormat对象的创建,但是由于对象是类共享的,每个线程都可以调用SimpleDateFormat的方法对其进行修改,所以会存在并发问题。

一种解决方式是加上synchronized。

synchronized (DateUtils.class) {
    return applyPattern(pattern).format(date);
}

高并发的时候,效率低。改为ThreadLocal方式实现:

/**
 * 日期工具类
 */
public final class DateUtils {

    private DateUtils() {}

    public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss";

    /**
     * SimpleDateFormat并非线程安全的, 如果创建一个static类型的, 会存在并发问题。
     * 如果在每个方法里都新建一个, 代价太大。
     * 所以此处使用threadlocal方式, 为每个线程新建一个SimpleDateFormat
     */
    private static ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<SimpleDateFormat>() {

        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat(DATE_TIME);
        }

    };

    private static SimpleDateFormat getDateFormat(String pattern) {
        SimpleDateFormat sdf = threadLocal.get();
        if (!sdf.toPattern().equals(pattern)) {
            sdf.applyPattern(pattern);
        }
        return sdf;
    }

    /**
     * 日期格式化, 默认格式: yyyy-MM-dd HH:mm:ss
     * @param date 日期
     * @return str
     */
    public static String format(Date date) {
        return format(date, DATE_TIME);
    }

    /**
     * 按指定格式格式化日期
     * @param date 日期
     * @param pattern 格式
     * @return str
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return "";
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        return getDateFormat(pattern).format(date);
    }

    /**
     * 将字符串转为日期
     * @param dateStr 日期字符串
     * @return date
     */
    public static Date parse(String dateStr) {
        return parse(dateStr, DATE_TIME);
    }

    /**
     * 按照指定格式将字符串转为日期
     * @param dateStr 日期字符串
     * @param pattern 格式
     * @return date
     */
    public static Date parse(String dateStr, String pattern) {
        if (dateStr == null || dateStr.isEmpty()) {
            return null;
        }
        if (pattern == null || pattern.isEmpty()) {
            pattern = DATE_TIME;
        }
        try {
            return getDateFormat(pattern).parse(dateStr);
        } catch (ParseException e) {
            // write log
            return null;
        }
    }

    public static void main(String[] args) {
        System.out.println(format(new Date()));
        System.out.println(parse("2016-12-01 10:00:00"));
    }
}

字符串转为LocalDateTime DateTimeFormatter.ofPattern(pattern).parse(str, LocalDateTime::from), 如果不带时间,转换会出错,如:str=2016-12-12。 日期格式化需要使用下面这种方式: DateTimeFormatter.ofPattern("yyyy-MM-dd").parse("2016-12-12", LocalDate::from)

results matching ""

    No results matching ""