JAVA中计算两个日期时间的差值竟然也有这么多门道

上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看 。题目很简单:

给定一个日期,然后计算下距离今天相差的天数 。
本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼镜,真正能写出来的人竟然寥寥无几,很多人写了一整张A4纸都写不下,最后还是没写完...他们在做什么?先取出今天的日期,然后分别计算得出年、月、日的值,然后将给定的字符串进行切割,得到目标的年、月、日,然后再判断是否闰年之类的逻辑,决定每月应该是加28天还是29天还是30或者31天,最后得出一个天数!
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
想想都令人窒息的操作...
日期时间的处理,是软件开发中极其常见的场景,JAVA中与日期、时间相关的一些类与API方法也很多,这里结合平时的编码实践全面的整理了下,希望可以帮助大家厘清其中的门道,更加游刃有余的面对此方面的处理~
JAVA中与日期时间相关的类java.util包中 类名
具体描述
Date
Date对象算是JAVA中历史比较悠久的用于处理日期、时间相关的类了,但是随着版本的迭代演进,其中的众多方法都已经被弃用,所以Date更多的时候仅被用来做一个数据类型使用,用于记录对应的日期与时间信息
Calender
为了弥补Date对象在日期时间处理方法上的一些缺陷,JAVA提供了Calender抽象类来辅助实现Date相关的一些日历日期时间的处理与计算 。
TimeZone
Timezone类提供了一些有用的方法用于获取时区的相关信息

JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
java.time包中JAVA8之后新增了java.time包,提供了一些与日期时间有关的新实现类:
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
具体每个类对应的含义梳理如下表:
类名
含义说明
LocalDate
获取当前的日期信息,仅有简单的日期信息,不包含具体时间、不包含时区信息 。
LocalTime
获取当前的时间信息,仅有简单的时间信息,不含具体的日期、时区信息 。
LocalDateTime
可以看做是LocalDate和LocalTime的组合体,其同时含有日期信息与时间信息,但是依旧不包含任何时区信息 。
OffsetDateTime
在LocalDateTime基础上增加了时区偏移量信息
ZonedDateTime
在OffsetDateTime基础上,增加了时区信息
ZoneOffset
时区偏移量信息,比如+8:00或者-5:00等
ZoneId
具体的时区信息,比如Asia/Shanghai或者America/Chicago

JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
时间间隔计算Period与Duration类JAVA8开始新增的java.time包中有提供Duration和Period两个类,用于处理日期时间间隔相关的场景,两个类的区别点如下:

描述
Duration
时间间隔,用于秒级的时间间隔计算
Period
日期间隔,用于天级别的时间间隔计算,比如年月日维度的
Duration与Period具体使用的时候还需要有一定的甄别,因为部分的方法很容易使用中被混淆,下面分别说明下 。
  • Duration
Duration的最小计数单位为纳秒,其内部使用seconds和nanos两个字段来进行组合计数表示duration总长度 。
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
Duration的常用API方法梳理如下:
方法
描述
between
计算两个时间的间隔,默认是秒
ofXxx
以of开头的一系列方法,表示基于给定的值创建一个Duration实例 。比如ofHours(2L),则表示创建一个Duration对象,其值为间隔2小时
plusXxx
以plus开头的一系列方法,用于在现有的Duration值基础上增加对应的时间长度,比如plusDays()表示追加多少天,或者plusMinutes()表示追加多少分钟
minusXxx
以minus开头的一系列方法,用于在现有的Duration值基础上扣减对应的时间长度,与plusXxx相反
toXxxx
以to开头的一系列方法,用于将当前Duration对象转换为对应单位的long型数据,比如toDays()表示将当前的时间间隔的值,转换为相差多少天,而toHours()则标识转换为相差多少小时 。
getSeconds
获取当前Duration对象对应的秒数,与toXxx方法类似,只是因为Duration使用秒作为计数单位,所以直接通过get方法即可获取到值,而toDays()是需要通过将秒数转为天数换算之后返回结果,所以提供的方法命名上会有些许差异 。


推荐阅读