Java各个时间类总结归纳,最全一篇( 三 )


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老哥|微信公众号




推荐阅读