基于jdk8的格式化时间方法

来源:互联网 发布:淘宝商城首页女装 编辑:程序博客网 时间:2024/06/10 05:30

背景

jdk8之前,java使用Date表示时间,在做时间的格式化时,通常使用SimpleDateFormat,但是SimpleDateFormat是非线程安全的,在写代码时通常要将之定义为局部变量或者使用ThreadLocal包装;
第三方库joda-time封装了很多对时间的处理方法,可以作为jdk7及其之前的标准时间处理库。jdk8发行后,提供了LocalDateTime,DateTimeFormatter等来处理时间,且都是线程安全的,joda-time也建议使用jdk8的java.time.*的库。

 Note that from Java SE 8 onwards, users are asked to migrate to java.time (JSR-310) - a core part of the JDK which replaces this project.

实现

参考joda-time的一些实现,将DateTimeFormatter放在本地缓存中,具体的实现代码如下:

    private static final ConcurrentMap<String, DateTimeFormatter> FORMATTER_CACHE = new ConcurrentHashMap<>();    private static final int PATTERN_CACHE_SIZE = 500;    /**     * Date转换为格式化时间     * @param date date     * @param pattern 格式     * @return     */    public static String format(Date date, String pattern){        return format(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()), pattern);    }    /**     * localDateTime转换为格式化时间     * @param localDateTime localDateTime     * @param pattern 格式     * @return     */    public static String format(LocalDateTime localDateTime, String pattern){        DateTimeFormatter formatter = createCacheFormatter(pattern);        return localDateTime.format(formatter);    }    /**     * 格式化字符串转为Date     * @param time 格式化时间     * @param pattern 格式     * @return     */    public static Date parseDate(String time, String pattern){        return Date.from(parseLocalDateTime(time, pattern).atZone(ZoneId.systemDefault()).toInstant());    }    /**     * 格式化字符串转为LocalDateTime     * @param time 格式化时间     * @param pattern 格式     * @return     */    public static LocalDateTime parseLocalDateTime(String time, String pattern){        DateTimeFormatter formatter = createCacheFormatter(pattern);        return LocalDateTime.parse(time, formatter);    }    /**     * 在缓存中创建DateTimeFormatter     * @param pattern 格式     * @return     */    private static DateTimeFormatter createCacheFormatter(String pattern){        if (pattern == null || pattern.length() == 0) {            throw new IllegalArgumentException("Invalid pattern specification");        }        DateTimeFormatter formatter = FORMATTER_CACHE.get(pattern);        if(formatter == null){            if(FORMATTER_CACHE.size() < PATTERN_CACHE_SIZE){                formatter = DateTimeFormatter.ofPattern(pattern);                DateTimeFormatter oldFormatter = FORMATTER_CACHE.putIfAbsent(pattern, formatter);                if(oldFormatter != null){                    formatter = oldFormatter;                }            }        }        return formatter;    }

有问题请联系wgy@live.cn!

原创粉丝点击