SimpleDateFormat 线程不安全替代方案

一、在项目有地方需要频繁使用格式化时间,但SimpleDateFormat是线程不安全的类。如果在每次使用都创建一个对象,很浪费资源。代码也很冗余,这里将SimpleDateFormat替代方案。

(1) 用ThreadLocal来放置DateFormat,使其同一个线程使用同一个SimpleDateFormat

 private static ThreadLocal threadLocal=new ThreadLocal(){
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };
    public static Date parse(String dateStr) throws ParseException {
        return threadLocal.get().parse(dateStr);
    }

    public static String format(Date date) {
        return threadLocal.get().format(date);
    }

(2)用DateTimeFormatter 代替 SimpleDateFormat(并附上 常用的Api)

public class SimpleDateFormatTest {
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    public static String timeFormatDate(LocalDateTime date) {
        return formatter.format(date);
    }

    public static LocalDateTime timeFormatDate(String dateStr) {
        return LocalDateTime.parse(dateStr, formatter);
    }


    public static void main(String[] args) {


        /******************************获取当前时间前后对应一段时间的时间*******************************/

        //当前时间10分钟之前的时间
        LocalDateTime minusMinutes = LocalDateTime.now().minus(10, ChronoUnit.MINUTES);
        //当前时间10天前的时间
        LocalDateTime minusDay = LocalDateTime.now().minus(10, ChronoUnit.DAYS);
        //当前时间10天后的时间
        LocalDateTime plusDay = LocalDateTime.now().plus(10, ChronoUnit.DAYS);

        /******************************获取当前时间前后对应一段时间的时间*******************************/

        //当前时间这个月零点值
        LocalDateTime curMonFist =
                LocalDateTime.now()
                        .withMonth(1)
                        .withDayOfMonth(1)
                        .withHour(0).
                        withMinute(0).
                        withSecond(0).
                        withNano(0);
        //当前时间这月一天
        LocalDateTime curMonLast = LocalDateTime.now().
                with(TemporalAdjusters.lastDayOfMonth()).
                withHour(23)
                .withMinute(59)
                .withSecond(59)
                .withNano(9999);

        /******************************当前时间的毫秒值*******************************/
        long l = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

        /******************************LocalDateTime与Date之间的转化*******************************/
        Date date = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
        LocalDateTime curLocalDateTime = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());

        System.out.println(timeFormatDate(curMonFist));
  /******************************获取指定时区时间的时间******************************/
    LocalDateTime.now(Clock.system(ZoneId.of("Asia/Shanghai")))
    }
}

你可能感兴趣的:(线程)