日期时间的处理,是软件开发中极其常见的场景,JAVA中与日期、时间相关的一些类与API方法也很多,这里结合平时的编码实践全面的整理了下,希望可以帮助大家厘清其中的门道,更加游刃有余的面对此方面的处理~
JAVA中与日期时间相关的类
java.util包中
类名 | 具体描述 |
---|---|
Date | Date对象算是JAVA中历史比较悠久的用于处理日期、时间相关的类了,但是随着版本的迭代演进,其中的众多方法都已经被弃用,所以Date更多的时候仅被用来做一个数据类型使用,用于记录对应的日期与时间信息 |
Calender | 为了弥补Date对象在日期时间处理方法上的一些缺陷,JAVA提供了Calender抽象类来辅助实现Date相关的一些日历日期时间的处理与计算。 |
TimeZone | Timezone类提供了一些有用的方法用于获取时区的相关信息 |
java.time包中
JAVA8之后新增了java.time包,提供了一些与日期时间有关的新实现类:
具体每个类对应的含义说明梳理如下表:
类名 | 含义说明 |
---|---|
LocalDate | 获取当前的日期信息,仅有简单的日期信息,不包含具体时间、不包含时区信息。 |
LocalTime | 获取当前的时间信息,仅有简单的时间信息,不含具体的日期、时区信息。 |
LocalDateTime | 可以看做是LocalDate和LocalTime的组合体,其同时含有日期信息与时间信息,但是依旧不包含任何时区信息。 |
OffsetDateTime | 在LocalDateTime基础上增加了时区偏移量信息 |
ZonedDateTime | 在OffsetDateTime基础上,增加了时区信息 |
ZoneOffset | 时区偏移量信息, 比如+8:00或者-5:00等 |
ZoneId | 具体的时区信息,比如Asia/Shanghai或者America/Chicago |
时间间隔计算
Period与Duration类
JAVA8开始新增的java.time包中有提供Duration和Period两个类,用于处理日期时间间隔相关的场景,两个类的区别点如下:
类 | 描述 |
---|---|
Duration | 时间间隔,用于秒级的时间间隔计算 |
Period | 日期间隔,用于天级别的时间间隔计算,比如年月日维度的 |
Duration与Period具体使用的时候还需要有一定的甄别,因为部分的方法很容易使用中被混淆,下面分别说明下。
- Duration
Duration的最小计数单位为纳秒,其内部使用seconds和nanos两个字段来进行组合计数表示duration总长度。
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()是需要通过将秒数转为天数换算之后返回结果,所以提供的方法命名上会有些许差异。 |
getNano | 获取当前Duration对应的纳秒数“零头”。 注意这里与toNanos()不一样,toNanos是Duration值的纳秒单位总长度,getNano()只是获取不满1s剩余的那个零头,以纳秒表示。 |
isNegative | 检查Duration实例是否小于0,若小于0返回true, 若大于等于0返回false |
isZero | 用于判断当前的时间间隔值是否为0 ,比如比较两个时间是否一致,可以通过between计算出Durati |