java8以前
只有一个对象,单一,使用起来不方便
Date(日期)
表示一个日期值
Calendar(日历)
表示一个日历
java8及以后
粒度更小,操作方便
Instant(瞬时)
时间线上的瞬时点。
Clock(时钟)
一种时钟,使用一个时区提供对当前时间、日期和时间的访问。
Duration(基于时间时间量)
基于时间的时间量,如“34.5秒”。
Period(基于日期的时间量)
ISO-8601日历系统中基于日期的时间量,例如“2年3个月4天”。
LocalDate(日期)
ISO-8601日历系统中没有时区的日期,例如2007-12-03。
LocalTime(时间)
在ISO-8601日历系统中没有时区的时间,例如10:15:30。
LocalDateTime(日期时间)
在ISO-8601日历系统中没有时区的日期时间,例如2007-12-03T10:15:30。
ZonedDateTime(带时区的日期时间,最好用这个,避免时区异常)
在ISO-8601日历系统中带有时区的日期时间,例如2007-12-03T10:15:30+01:00 Europe/Paris。
Year(年)
在ISO-8601日历系统中的一年,如2007。
YearMonth(年月)
在ISO-8601日历系统中的一年一月,如2007-12。
MonthDay(月日)
在ISO-8601日历系统中的一个月日,如12-03。
OffsetTime(时间偏差)
在ISO-8601日历系统中,与UTC/格林尼治偏差的时间,例如10:15:30+01:00。
OffsetDateTime(日期时间偏差)
在ISO-8601日历系统中与UTC/格林尼治偏差的日期时间,例如2007-12-03T10:15:30+01:00。
两者转换
思路就是以Instant作为桥梁转换:
ZonedDateTime转Date
public Date asDate(ZonedDateTime zonedDateTime) {
return Date.from(zonedDateTime.toInstant());
}
Date转ZonedDateTime
public ZonedDateTime asZDT(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault());
}