LocalDateTime也是一个不可变类且线程安全,它的默认格式为yyyy-MM-ddTHH:mm:ss.zzz,显然在日常的web开发过程中我们都会对这样的日期格式进行格式化,这就是我这边特别要提的一点了 。
之前我们讲过java.text.SimpleDateFormat可以自定义格式化时间格式,但是他并不是线程安全的类,所以java8开始配合LocalDateTime提供了java.time.format.DateTimeFormatter来搞定这个问题 。
* @implSpec * This class is immutable and thread-safe. * * @since 1.8 */public final class DateTimeFormatter
这是官方对他的介绍,这个类是不可变并且是线程安全的 。所以我们可以放心地用了 。
但是友情提醒下线程安全+线程安全不一定线程安全,不要误解了,这里就不展开讨论了 。下面我们和SimpleDateFormat一起对比着来使用一下 。
// LocalDateTimeLocalDateTime localDateTime = LocalDateTime.now();String newLocalDateTime = localDateTime.format(DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss"));System.out.println("LocalDateTime = "+localDateTime);System.out.println("DateTimeFormatter 格式化后的时间 = "+newLocalDateTime);//DateSimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date();System.out.println("new Date() = "+date);String s = simpleDateFormat.format(date);System.out.println("SimpleDateFormat 格式化Date后 = "+s);
输出
LocalDateTime = 2020-06-10T14:41:02.546DateTimeFormatter 格式化后的时间 = 2020-06-10 14:41:02new Date() = Wed Jun 10 14:41:02 CST 2020SimpleDateFormat 格式化Date后 = 2020-06-10 14:41:02
从代码量上就可以看到DateTimeFormatter的优势了,一行搞定 。
相比一下SimpleDateFormat每次都要new一个对象,在极端情况下就会导致创建很多实例短时间无法回收而浪费很多内存空间,当然我们也可以通过使用静态变量通过添加synchronized来达到目的,但是同步块不可避免的问题就是阻塞 。
当然你一定会说我可以使用ThreadLocal来创建副本来解决SimpleDateFormat的线程安全问题 。这个是比较好的一个解决方案,如下:
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); }};
System.out.println("ThreadLocal = "+threadLocal.get().format(date));
输出
ThreadLocal = 2020-06-10 14:52:05
显然结果挺好的,但是使用LocalDateTime.format(DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss"))一行就能解决了,相对而言是比较会更简洁和方便一些,所以推荐使用DateTimeFormatter 。
作者|IT老哥|微信公众号
推荐阅读
- Java集合-Iterator
- Google开源Java图片处理类库Thumbnail
- JavaScript 各种遍历方式详解
- 西安全运会时间是何时?
- 汽车保养周期看公里数还是看时间
- 今年新茶更爱装嫩,浙江为今年新茶上市赢得时间
- 君山银针生产上市时间,君山银针的简历
- 喝茶细节之安排座位,喝茶要注意时间和体质
- 喝茶的时间应如何把握,如何看云南七子茶饼的年份
- JavaScript的宏任务和微任务