jdk8以前,java使用Date表示時間,在作時間的格式化時,一般使用SimpleDateFormat,可是SimpleDateFormat是非線程安全的,在寫代碼時一般要將之定義爲局部變量或者使用ThreadLocal包裝;
第三方庫joda-time封裝了不少對時間的處理方法,能夠做爲jdk7及其以前的標準時間處理庫。jdk8發行後,提供了LocalDateTime,DateTimeFormatter等來處理時間,且都是線程安全的,joda-time也建議使用jdk8的java.time.*的庫。java
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放在本地緩存中,具體的實現代碼以下:web
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