缓存SimpleDateFormat实例的Map,原代码每次new消耗性能 修改后提升性能并保证线程安全

pull/503/head
MagicJson 2024-07-11 00:00:52 +08:00
parent 66d828ce6d
commit 7c8278fce6
1 changed files with 40 additions and 9 deletions

View File

@ -1,15 +1,16 @@
package com.ruoyi.common.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.util.StringUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.*;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
*
@ -33,6 +34,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
// 缓存SimpleDateFormat实例的Map其中每个格式字符串对应一个ThreadLocal<SimpleDateFormat>
private static final Map<String, ThreadLocal<SimpleDateFormat>> dateFormatMap = new HashMap<>();
/**
* Date
*
@ -73,11 +76,39 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return parseDateToStr(YYYY_MM_DD, date);
}
public static final String parseDateToStr(final String format, final Date date)
{
return new SimpleDateFormat(format).format(date);
/**
* new 线
*
* @param format "yyyy-MM-dd"
* @param date
* @return
* @throws IllegalArgumentException
*/
public static String parseDateToStr(final String format, final Date date) {
if (!StringUtils.hasLength(format)) {
throw new IllegalArgumentException("Format must not be null or empty");
}
if (Objects.isNull(date)) {
throw new IllegalArgumentException("Date must not be null");
}
return getDateFormat(format).format(date);
}
/**
* SimpleDateFormat
* MapMap
* @param format
* @return SimpleDateFormat
*/
private static SimpleDateFormat getDateFormat(final String format) {
return dateFormatMap
.computeIfAbsent(format
, k -> ThreadLocal.withInitial(() -> new SimpleDateFormat(k)))
.get();
}
public static final Date dateTime(final String format, final String ts)
{
try