Java中的日期表示

博客好久没有更新了,整天腐朽,忘记学习。
但是,我今天洗心革面了,我要开始认真学习了!!!
在这里插入图片描述
注:以下代码基于JDK8(14都出来了,你还用8,太low了)

一、Date类

说起java中的日期表示,大家第一时间想到的应该是Date吧,毕竟它存在的时间很久,那么我们先来看看用Date类时怎么获取时间的。

(一)Date基本表示

Date date = new Date();
System.out.println("当前时刻  "+date);
System.out.println("当前年份  " + date.getYear());
System.out.println("当前月份  " + date.getMonth());
System.out.println("当前天数  " + date.getDay());

在这里插入图片描述
我们来看一下运行结果。
第一行:凑合一下还能看懂
第二行:120?我的2020呢??(Date默认时间从1900年开始)
第三行:3?说好的4月份呢
第四行:4?这咋读噢
可以看出Date的可读性是比较差的

(二)构造一个指定的日期

如果你想这么写的话

Date date = new Date(2020, 4, 16);

在这里插入图片描述
很抱歉,这是不行的,你可以看到构造函数有一条横线,说明它已经过时了!连构造函数都过时了??
在这里插入图片描述
但是, 如果你仔细看的话,会发现它的很多方法其实都被弃用了!
在这里插入图片描述
所以你还敢用么?

(三)格式化日期

如果你确实想要一个指定格式的输出结果,那么你就需要用到SimpleDateFormat来指定格式了。

SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat form2 = new SimpleDateFormat("yyyy-MM-dd E HH:mm:ss");
Date current = new Date();
String date = form.format(current);
String date2 = form2.format(current);
System.out.println(date);
System.out.println(date2);

在这里插入图片描述
这样看起来貌似还挺不错的,但是一会儿你就知道问题所在了。

二、LocalDateTime

java1.8出了一系列和时间日期有关的类,LocalDate、LocalTime和LocalDateTime,最常用的是LocalDateTime,我们先来看看它的用法。

(一)基本使用

LocalDateTime current = LocalDateTime.now();
System.out.println("当前时刻 : " + current);
System.out.println("当前年份 : " + current.getYear());
System.out.println("当前月份 : " + current.getMonth());
System.out.println("当前日份 : " + current.getDayOfMonth());
System.out.println("当前时   : " + current.getHour());
System.out.println("当前分   : " + current.getMinute());
System.out.println("当前秒   : " + current.getSecond());

在这里插入图片描述
这样是不是清晰多了!
在这里插入图片描述

(二)指定格式的的时间

LocalDateTime every = LocalDateTime
						.of(2020, Month.APRIL, 16, 20, 49);

在这里插入图片描述

(三)修改日期

很灵活的修改日期

        LocalDateTime every = LocalDateTime.now();
        //减少
        every = every.minusYears(2);
        every = every.minusDays(3);
        //增加
        every = every.plusDays(23);
        //直接修改到具体日期
        every = every.withDayOfMonth(23);

(四)格式化日期

LocalDateTime now = LocalDateTime.now();
String res1 = now.format(DateTimeFormatter.ISO_DATE);
String res2 = now.format(DateTimeFormatter.BASIC_ISO_DATE);
String res3 = now.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
System.out.println("格式一: " + res1);
System.out.println("格式二: " + res2);
System.out.println("格式三: " + res3);
//格式一: 2020-04-16
//格式二: 20200416
//格式三: 2020/04/16

非常的方便简洁!

(五)时间反解析

就是给你一个指定的字符串,按照需要的格式反解出时间

LocalDateTime time = LocalDateTime.parse("2020--04--16 21:06:02",
                DateTimeFormatter.ofPattern("yyyy--MM--dd HH:mm:ss"));
System.out.println("反解析的结果是  " + time);
//反解析的结果是  2020-04-16T21:06:02

在这里插入图片描述

三、线程安全问题

上面说那么多只是在讲用法,只能说明LocalDateTime好用。这倒不是问题的关键,主要是因为线程安全问题,这才是最致命的。

所以如果多线程状况下要对Date进行修改就需要自己保证线程安全,否则就翻车了。
但是java8退出的LocalDateTime是线程安全的,我们可以看官方源码的介绍:
在这里插入图片描述
不可变且线程安全的!!
所以就这一句,足以让你放弃Date而使用LocalDateTime了。

有关于格式转化的问题

和Date经常一起使用的还有格式化日期的类SimpleDateFormat,但是它也是非线程安全的。我们看源码介绍就知道了:
在这里插入图片描述
那么线程安全的选择是什么嘞?就是上面说到的DateTimeFormatter
在这里插入图片描述
可以看到它也是不可变且线程安全的。

在这里插入图片描述

四、总结

1、展示了Date表达上的不足和LocalDateTime的清晰表达
2、说明了Date和SimpleDateFormat最致命的问题就在于线程安全

其实我这里展示的只是LocalDateTime的一部分API,它还有很多的用法,比如进行Date转变为LocalDateTime。我这里就不一一列举了,大家有需要可以翻阅API文档。

(感觉以前的博客写的太枯燥了,所以从这期开始就会慢慢改变自己的内容表达风格和排版问题,希望大家能喜欢<好像本来也没什么人看QAQ,咳咳>)

注:如果有任何问题,欢迎大家留言或私信~~

猜你喜欢

转载自blog.csdn.net/machine_Heaven/article/details/105565665