为什么建议你使用 LocalDateTime ,而不是 Date ?

本文最后更新于:2021年3月24日 晚上

JDK8 之后大家都推崇LocalDateTime,那LocalDateTime 到底比 Date 好在哪里呢?

1. Date如果不格式化,打印出的日期可读性差

Thu Mar 25 14:52:56 CST 2021        # Date
2021-03-25T14:52:56.254             # LocalDateTime

2. Date的日期工具类线程不安全

解析SimpleDateFormat的format方法的源码你会发现,里面有个 calendar 共享变量,但是这个共享变量没有做线程安全控制。

所以,当多个线程同时使用相同的SimpleDateFormat对象(如用 static 修饰的SimpleDateFormat)调用format方法时,多个线程会同时调用 calendar.setTime 方法,可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。

在多并发情况下,SimpleDateFormat除了 format 是线程不安全以外,parse 方法也是线程不安全的。

parse 方法实际调用 alb.establish(calendar).getTime() 方法来解析,alb.establish(calendar) 方法里主要完成了

  • 重置日期对象cal的属性值
  • 使用calb中中属性设置cal
  • 返回设置好的cal对象

但是这三步不是原子操作。

2.1 那么多线程并发如何保证SimpleDateFormat的线程安全呢?

  • 避免线程之间共享一个SimpleDateFormat对象即可
    这样的话每个线程使用时都创建一次SimpleDateFormat对象,创建和销毁对象的开销变大。
  • 对使用format和parse方法的地方进行加锁
    加锁可能会导致线程阻塞,性能差。
  • 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象

3. Date对时间处理比较麻烦

Date对时间处理比较麻烦,比如想获取某年、某月、某星期,以及n天以后的时间,如果用Date来处理的话太过麻烦,

在JDK早期版本有getYear、getMonth这些方法,获取年月日很Easy,但这些在新的JDK里都被弃用了。

4. 参考链接


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!