在之前的项目中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
获取直接获取时间可读性比较差,并且单独获取年、月时无法直观的读取,并且许多方法都已弃用
自 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的官方源码中即可看出:
之前对Date进行格式化操作的SimpleDateFormat类也是线程不安全的,在源码中也有提过
建议使用DateTimeFormatter类