基于jdk8的格式化时间方法
2024-09-04 06:15:34
背景
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
最新文章
- winform窗体(五)——布局方式
- ACM: FZU 2150 Fire Game - DFS+BFS+枝剪 或者 纯BFS+枝剪
- msm8916 lcd 相关调试点指导
- ORACLE 分区
- C++ 串
- 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
- 新建一个类并绑定一个activity
- windows上放弃使用PyGTK
- 2016年会成为Java EE微服务年吗?
- day059-60 ajax初识 登录认证练习 form装饰器, form和ajax上传文件 contentType
- vue计算属性(通过计算得来的属性)
- centos U盘挂载问题
- mac os High Sierra 升级错误
- vbs调用bat 隐藏bat运行时的黑框
- 3.Appnium的安装
- tensorflow的save和restore
- xtrabackup 恢复单个表【转】
- [svc]Linux vmstat命令实战详解
- 学记笔记 $\times$ 巩固 &#183; 期望泛做$Junior$
- java多态-向上转型和向下转型
热门文章
- bzoj1001题解
- NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
- 关于C++里set_intersection(取集合交集)、set_union(取集合并集)、set_difference(取集合差集)等函数的使用总结
- 2018-2019-2-20175323 java实验四 Android程序设计
- P1802 5倍经验日
- 关于idea中,web项目启动tomcat,访问资源报错404
- ASP.NET MVC Controller激活系统详解2
- 2019 牛客多校第六场 J Upgrading Technology
- Linux环境下Jmeter 报错:Unable to get local host IP address
- Mybatis 使用的 9 种设计模式,真是太有用了~