博客好久没有更新了,整天腐朽,忘记学习。
但是,我今天洗心革面了,我要开始认真学习了!!!
注:以下代码基于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,咳咳>)
注:如果有任何问题,欢迎大家留言或私信~~
今天的文章java中的日期类型_java基础知识点整理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62904.html