Java 8日期/时间( Date/Time)API是java8很重要的新增内容,也是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容。
为什么我们需要新的Java日期/时间API?
在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:
Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
对于时间、时间戳、格式化以及解析,并没有一些明确定义的类。对于格式化和解析的需求,我们有java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求。
原有的时间类使用不方便,新时间类增加了很多语义化好的方法,比如plusMonths,plusWeeks。
所有的日期类都是可变的,因此他们都不是线程安全的,这是Java日期类最大的问题之一。
日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
java8 java.time关键类
|
Instant——表示时间线上一个特定时刻
LocalDate——只包含日期时间类
LocalTime——它代表的是不含日期的时间,时分秒
LocalDateTime——包含了日期及时间,不存储时区信息
ZonedDateTime——包含时区的完整日期时间
|
Instant
由于java8中新增的time类都是不可变类,所以下面这些方法都会返回一个新的对象
|
Instant
now
=
Instant
.
now
(
)
;
//获取当前时间 2017-04-15T02:22:38.842Z ISO-8601格式
now
.
plusSeconds
(
1
)
;
//增加秒,正负均可
now
.
plusMillis
(
100
)
;
now
.
plus
(
1
,
ChronoUnit
.
DAYS
)
;
//增加一天
Instant
.
ofEpochMilli
(
System
.
currentTimeMillis
(
)
)
;
//从时间戳获取实例
|
从时间格式字符串获取实例,ISO格式
|
Instant
.
parse
(
"2017-04-15T02:32:24.779Z"
)
|
Instant时间大小先后比较
|
now
.
isAfter
(
otherInstant
)
;
now
.
isBefore
(
otherInstant
)
;
|
LocalDate
下面都是一些很直观可读性很强的方法,也没有老的时间库月份需要加1的坑
|
LocalDate
localDate
=
LocalDate
.
now
(
)
;
//java8中获取当前日期 2017-04-15
System
.
out
.
println
(
localDate
.
getYear
(
)
)
;
//年 2017
System
.
out
.
println
(
localDate
.
getMonth
(
)
)
;
//月 APRIL
System
.
out
.
println
(
localDate
.
getMonthValue
(
)
)
;
//月数值 4
System
.
out
.
println
(
localDate
.
getDayOfMonth
(
)
)
;
//天 15
|
java8中获取特定日期
|
LocalDate
.
of
(
2017
,
3
,
10
)
;
|
java8中判断时间是否相等
Instant,LocalDate,LocalDateTime,ZonedDateTime都重写了equals方法,直接通过equals方法比较即可。
年月日增减
|
localDate
.
plusYears
(
1
)
;
localDate
.
plusMonths
(
1
)
;
localDate
.
plusWeeks
(
1
)
;
localDate
.
plusDays
(
1
)
;
|
LocalDateTime
localDateTime于LocalDate类似,均含有get方法,of方法等。
|
System
.
out
.
println
(
localDateTime
.
getYear
(
)
)
;
//年 2017
System
.
out
.
println
(
localDateTime
.
getMonth
(
)
)
;
//月 APRIL
System
.
out
.
println
(
localDateTime
.
getMonthValue
(
)
)
;
//月数值 4
System
.
out
.
println
(
localDateTime
.
getDayOfMonth
(
)
)
;
System
.
out
.
println
(
localDateTime
.
getHour
(
)
)
;
System
.
out
.
println
(
localDateTime
.
getMinute
(
)
)
;
System
.
out
.
println
(
localDateTime
.
getSecond
(
)
)
;
System
.
out
.
println
(
localDateTime
.
getNano
(
)
)
;
|
java8中时间差比较
到下一个整点相差分钟数,11:20,还有40分钟12点
|
LocalTime
localTime1
=
LocalTime
.
of
(
11
,
20
)
;
LocalTime
localTime2
=
LocalTime
.
of
(
12
,
0
)
;
System
.
out
.
print
(
localTime1
.
until
(
localTime2
,
ChronoUnit
.
MINUTES
)
)
;
|
java8时间类相互转换
Instant 转Date
Date转Instant
LocalDateTime转Instant
|
localDateTime
.
atZone
(
ZoneId
.
systemDefault
(
)
)
.
toInstant
(
)
;
|
Instant转LocalDateTime
|
ZoneId
zone
=
ZoneId
.
systemDefault
(
)
;
LocalDateTime
localDateTime
=
LocalDateTime
.
ofInstant
(
instant
,
zone
)
;
|
LocalDateTime获取LocalTime
|
LocalTime
localTime
=
localDateTime
.
toLocalTime
(
)
;
|
文章来源:http://www.itdouzi.com/java/java8-instant-localdatetime.html