在之前的项目中java获取时间都采用new Date() 的方法 但是使用时需要格式化才能更好的运用各种场景

        Date date = new Date();
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );
        String str = sdf.format(date);
        System.out.println("当前时间"+date);
        System.out.println("当前时间格式化后"+str);
        System.out.println("当前年"+date.getYear());
        System.out.println("当前月"+date.getMonth());
        // 当前时间Thu Dec 23 09:31:25 CST 2021
        // 当前时间格式化后2021-12-23 09:31:25 444
        // 当前年121
        // 当前月11

获取直接获取时间可读性比较差,并且单独获取年、月时无法直观的读取,并且许多方法都已弃用
image.png
自 Java8开始,JDK中其实就增加了一系列表示日期和时间的新类,最典型的就是

LocalDateTime

1、获取当前的时间

        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("当前时间"+localDateTime);
        System.out.println("当前年"+localDateTime.getYear());
        System.out.println("当前月"+localDateTime.getMonth());
        System.out.println("当前日"+localDateTime.getDayOfMonth());
        System.out.println("当前时"+localDateTime.getHour());
        System.out.println("当前分"+localDateTime.getMinute());
        System.out.println("当前秒"+localDateTime.getSecond());
//        当前时间2021-12-23T09:39:51.793
//        当前年2021
//        当前月DECEMBER
//        当前日23
//        当前时9
//        当前分39
//        当前秒51

2.造一个指定年、月、日的时间:

构造一个2021年12月23日9点45分32秒的时间

	LocalDateTime  beforeDate =LocalDateTime. of(2021, Month.DECEMBER,23,9, 45,32);
        System.out.println(beforeDate);
        //2021-12-23T09:45:32

3.修改日期

LocalDateTime localDateTime = LocalDateTime.now();
        localDateTime = localDateTime.minusYears(3);//减少五年
        System.out.println("当前时间(减少五年)"+localDateTime);
        localDateTime =localDateTime.plusMonths(3);//添加三个月
        System.out.println("当前时间(添加三个月)"+localDateTime);
        
        localDateTime =localDateTime.withYear(2022);//修改年为2022年
        System.out.println("当前时间(修改年为2022年)"+localDateTime);
        localDateTime =localDateTime.withMinute(40);//修改分钟为40
        System.out.println("当前时间(修改分钟为40)"+localDateTime);
//        当前时间(减少五年)2018-12-23T09:54:21.883
//        当前时间(添加三个月)2019-03-23T09:54:21.883
//        当前时间(修改年为2022年)2022-03-23T09:54:21.883
//        当前时间(修改分钟为60)2022-03-23T09:40:21.883

4.格式化日期

	LocalDateTime localDateTime = LocalDateTime.now();
        String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
	//2021/12/23

5.时间解析

LocalDateTime localDateTime = LocalDateTime.parse("2021-12-23 09:31:25 444", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss SSS"));
        System.out.println(localDateTime); //2021-12-23T09:31:25.444

以上列出了两种方法的具体使用,接下来要了解一下他们的线程安全性的问题

其实以前我们惯用的 Date时间类是可变类,这就意味着在多线程环境下对共享 Date变量进行操作时,必须由程序员自己来保证线程安全!否则极有可能翻车。

而自 Java8开始推出的 LocalDateTime却是线程安全的,开发人员不用再考虑并发问题,这点我们从 LocalDateTime的官方源码中即可看出:
image.png

之前对Date进行格式化操作的SimpleDateFormat类也是线程不安全的,在源码中也有提过
16402267541.png
建议使用DateTimeFormatter类
16402268391.png