背景

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

最新文章

  1. winform窗体(五)——布局方式
  2. ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪
  3. msm8916 lcd 相关调试点指导
  4. ORACLE 分区
  5. C++ 串
  6. 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
  7. 新建一个类并绑定一个activity
  8. windows上放弃使用PyGTK
  9. 2016年会成为Java EE微服务年吗?
  10. day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
  11. vue计算属性(通过计算得来的属性)
  12. centos U盘挂载问题
  13. mac os High Sierra 升级错误
  14. vbs调用bat 隐藏bat运行时的黑框
  15. 3.Appnium的安装
  16. tensorflow的save和restore
  17. xtrabackup 恢复单个表【转】
  18. [svc]Linux vmstat命令实战详解
  19. 学记笔记 $\times$ 巩固 &#183; 期望泛做$Junior$
  20. java多态-向上转型和向下转型

热门文章

  1. bzoj1001题解
  2. NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
  3. 关于C++里set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)等函数的使用总结
  4. 2018-2019-2-20175323 java实验四 Android程序设计
  5. P1802 5倍经验日
  6. 关于idea中,web项目启动tomcat,访问资源报错404
  7. ASP.NET MVC Controller激活系统详解2
  8. 2019 牛客多校第六场 J Upgrading Technology
  9. Linux环境下Jmeter 报错:Unable to get local host IP address
  10. Mybatis 使用的 9 种设计模式,真是太有用了~