基於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM