自 Java8
开始, JDK
中其实就增加了一系列表示日期和时间的新类,最典型的就是 LocalDateTime
。直言不讳,这玩意的出现就是为了干掉之前 JDK
版本中的 Date
老哥!
同样,我们也先来感受一下用法!
一、获取当前此刻的时间
* 测试LocalDateTime的用法
*/
public class LocalDateTimeTest {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("当前年份:" + (localDateTime.getYear()-4)); // 2020
System.out.println("当前日份:" + localDateTime.getDayOfMonth()); // 11
System.out.println("--------------------");
String result1 = localDateTime.format(DateTimeFormatter.ISO_DATE);
String result2 = localDateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
String result3 = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd 00:00:00"));
System.out.println("格式化后的日期result1:" + result1);
System.out.println("格式化后的日期result2:" + result2);
System.out.println("格式化后的日期result3:" + result3);
}
}
测试结果:
二、线程安全性问题
其实以前我们惯用的 Date
时间类是可变类,这就意味着在多线程环境下对共享 Date
变量进行操作时,必须由程序员自己来保证线程安全!否则极有可能翻车
而自 Java8
开始推出的 LocalDateTime
却是线程安全的,开发人员不用再考虑并发问题,这点我们从 LocalDateTime
的官方源码中即可看出:
三、日期格式化的选择
大家除了惯用 Date
来表示时间之外,还有一个用于和 Date
连用的 SimpleDateFormat
时间格式化类大家可能也戒不掉了!
SimpleDateFormat
最主要的致命问题也是在于它本身并不线程安全,这在它的源码注释里已然告知过了:
那取而代之,我们现在改用什么呢?其实在前文已经用到啦,那就是了 DateTimeFormatter
了,他也是线程安全的: