Java各个时间类总结归纳,最全一篇

前言本文主要针对Date、Calendar、Instant、LocalDate、LocalTime和LocalDateTime的使用做了介绍并进行了对比,同时对simpleDateFormat和simpleDateFormat进行了对比和介绍 。篇幅较长可针对具体模块选择性阅读 。
Date对于Date类型最常用的操作想必就是new Date()了
 public static void main(String[] args) {  System.out.println(new Date());}这时候我们会得到一个当前时间的一个Date类型的字段输出字样为Tue Jun 09 19:20:37 CST 2020 一个带有年月日时分秒的时间 。
其中的CST可视为美国、澳大利亚、古巴或中国的标准时间,在这边就是中国的标准时间了 。
当然我们对于这样格式的时间的做法是通过JAVA.text.SimpleDateFormat类来进行格式化之后返回页面展示
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) {  System.out.println(simpleDateFormat.format(new Date()));}输出为2020-06-09 19:43:21这个就是我们最为熟悉的一个时间字段格式化之后的结果了 。
当然这里要友情提醒的是SimpleDateFormat这个类并不是线程安全的,在高并发场景下需要谨慎使用 。Date类型自带有很多的函数具体如下:

Java各个时间类总结归纳,最全一篇

文章插图
 

Java各个时间类总结归纳,最全一篇

文章插图
 
可以发现很多都已经变成过时函数,虽然还可以使用但是并不保证在将来某个更新中被删除的可能性,我们也是不推荐使用这种过时的函数的 。
这时候java.util.Calendar是一个不错的类可以帮我们解决很多问题 。
相信一开始接触java的小伙伴一定被Calendar的强大征服过,但是用久了慢慢地我们会发现其实这个类并没有想象中那么强大,首先一个问题就是它并不支持时区,其次它也不是线程安全的 。
所以考虑到它的种种缺陷,java8使用了新的时间和日期API LocalDateTime
InstantInstant表示的是时间线上的一个点,也就是时刻,可以和Date做一个比较 。
比较直接的一个不同就是Instant获取的是UTC的时间,而Date是根据当前服务器所处的环境的默认时区来获取的当前时间 。
//Date案例SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date();System.out.println("new Date() = "+date);String s = simpleDateFormat.format(date);System.out.println("SimpleDateFormat 格式化Date后 = "+s);//Instant案例Instant instant = Instant.now();System.out.println("Instant = "+instant);System.out.println("Instant +08:00 = "+instant.atOffset(ZoneOffset.ofHours(8)));输出
new Date() = Wed Jun 10 15:27:48 CST 2020SimpleDateFormat 格式化Date后 = 2020-06-10 15:27:48Instant = 2020-06-10T07:27:48.198ZInstant +08:00 = 2020-06-10T15:27:48.198+08:00默认时区是UTC在使用Instant的时候是一个需要注意的点,也是容易忽略的一个点,这里划重点!相同的问题在LocalDate、LocalTime和LocalDateTime是不存在的 。
但是Instant的官方描述来看,它是一个不可变的且线程安全的类
 * @implSpec * This class is immutable and thread-safe. * @since 1.8 */public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable {}有效时间范围是从-1000000000-01-01T00:00Z~-1000000000-01-01T00:00Z,可以满足大部分场景下的时刻现实问题 。
同时在java8提供了toInsatant()和from()两个方法用于Date和Instant之间的来回转换
System.out.println("toInstant() = "+date.toInstant());System.out.println("from() = "+Date.from(instant));输出
toInstant() = 2020-06-10T07:45:42.440Zfrom() = Wed Jun 10 15:45:42 CST 2020可以看到相互转换过程中的时区问题不需要我们考虑,会自动+08:00或者-08:00 。
比较头疼的一个事情就是java8没有针对Instant提供一个可供自定义的格式化类,所以这边我的解决方法是转换成LocalDateTime,再使用DateTimeFormatter来完成格式化 。
System.out.println("Instant = " + LocalDateTime.ofInstant(instant, ZoneId.systemDefault())        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));


推荐阅读