java日期时间API总结
Date
java中常见的表示时间的类。内部使用long类型的值表示自1970-01-01起的毫秒数。本质上是一个表示瞬时时间的类,表示级别为毫秒。且其为可变对象,即线程不安全的。目前大多数方法已废弃。可用且常见的方法如下:
方法 | 含义 |
---|---|
new Date() | 创建一个表示当前时间的对象 |
new Date(long time) | 传入一个表示自1970年1月1日起的毫秒数,基于此时间创建对象 |
from(Instant instant) | 以Instant类的对象构建对象,java8新增 |
toInstant() | 将Date对象转为Instant对象,java8新增 |
Instant
java8新增类,专门用于表示时间戳。想获取当前时间的时间戳可用Instant.now()
获取。
关于Instant比较常用的是与Date的相互转化及比较两时间戳的差值。如下:
1 | //获取当前时间戳 |
LocalDate
java8新增的表示日期的类。默认格式为yyyy-MM-dd
,表示具体某一天。可由now()
获取当前日期,也可传入年月日构造。类中有格式化方法。
常用方法如下:
方法 | 静态方法 | 含义 |
---|---|---|
now() | 是 | 获取当天日期 |
of(year,month,days) | 是 | 根据传入的值构造日期 |
parse(dateStr) | 是 | 解析日期字符串(需为yyyy-MM-dd格式)为日期格式 |
format | 否 | 格式化日期为字符串 |
isLeapYear() | 否 | 是否为闰年 |
lengthOfMonth() | 否 | 该月长度 |
getDayOfWeek() | 否 | 表示是周几,返回枚举类 |
plusXXX | 否 | XXX可为年、月或日,表示添加一段时间,返回新日期 |
minusXXX | 否 | 同plusXXX类似,在实例基础上减去某个值,返回新日期 |
equal() | 否 | 比较两日期是否相等 |
总的来说,LocalDate表示代表本地时间的日期,API为我们提供了构造、解析、格式化及计算等方法,使得日期表示更简便。
1 |
|
LocalTime与LocalDateTime
LocalTime、LocalDateTime与LocalDate类似,LocalTime表示本地时间,LocalDateTime表示本地日期时间。用法也与LocalDate类似。下面简单介绍下。
LocalTime
1 | //获取当前时间 |
LocalDateTime
用来表示日期及时间,包含LocalDate与LocalTime的信息,比较常用。方法与前两者类似。
1 | // 获取当前日期时间 |
日期格式化
java8的日期格式化再也不用SimpleDateFormat
类做复杂的日期转化了,格式化的函数都包含在各自的日期时间类中。以LocalDateTime
为例:
1 |
|
时间差值
java8可以计算时间差值的类有:Period
和 Duration
以及ChronoUnit
。其中ChronoUnit
计算时间差值主要也是用到了Duration
。而Period
主要是针对日期的间隔计算,而Duration
主要是针对时间的。看一下示例:
Period
Period表示以日期为单位的时间段,即其最小单位也要是day
。常用于计算两LocalDate
之间的差值
1 |
|
Duration
相比Period
,Duration
用于表示两个时间的时间差值,而不仅仅是日期。如可以表示两时间点差值,日期差值。
需注意的是,Duration内部表示时间差是用两个long类型的值:秒(second)及纳秒(nanos)表示的,若用于计算两日期相差天数等问题,通常是将秒换算成天得到的。这样也表明,两时间值至少需要精确到秒,否则不能完成转化,即LocalDate是不能用Duration
1 |
|
ChronoUnit
上面说Duration不能用在LocalDate上,而我需要计算两日期相差天数,就不能直接计算得到吗。事实上当然可以了,可以使用ChronoUnit
。
1 |
|
不仅如此,ChronoUnit
类可用于计算上述所提到的各种时间差。计算模式也很固定
ChronoUnit.计量单位.between(start,end)
1 |
|
新旧时间转化
Date与Instant
Date与Instant都可表示瞬时时间,转化方式上面也有所提及,即:
1 |
|
Data与LocalDate
1 |
|