zoukankan      html  css  js  c++  java
  • 基于jdk8的格式化时间方法

    背景

    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;
        }

    原文地址:https://blog.csdn.net/u011236357/article/details/78296293

  • 相关阅读:
    XXX is not in the sudoers file
    git错误“无法推送一些引用到xxx"的解决方法
    mysql开启远程访问
    ubuntu 在启动器中启动webstorm和phpstorm
    ubuntu nginx卸载和安装
    基于grunt构建的前端集成开发环境
    fullPage.js
    常见的HTTP状态码
    JS随机数
    CSS3简单的动画
  • 原文地址:https://www.cnblogs.com/jpfss/p/11377033.html
Copyright © 2011-2022 走看看