相比较于之前的版本之前的版本,增加了很大新特性,其中关于时间多了很多功能:LocalDateTime,LocalDate,LocalTime。
时间介绍
LocalDate是年月日;LocalTime是时分秒;LocalDateTime则是两者的合并,可以通过下面得到:
1 2 3
| LocalTime localTime = LocalTime.now(); LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
|
或
1
| LocalDateTime localDateTime = LocalDateTime.now();
|
Java8对这几个时间提供了丰富的时间计算接口。
关于Date和String之间的转化,我这里就不多说了
String –> LocalDate/LocalTime/LocalDateTime
String类型转化新特性时间可以使用 DateTimeFormatter 功能。
1 2
| DateTimeFormatter dateformatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate ld = LocalDate.parse("2017-08-01", dateformatter);
|
1 2
| DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime ldt = LocalDateTime.parse("2017-09-22 11:30:10", df);
|
1 2 3
| String time = "11:30:10"; DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm:ss"); LocalTime lt = LocalTime.parse(time,df);
|
但是在转化的时候要注意了,你不能把“2017-08-01”的String转化成LocalDateTime/LocalTime,不然会报错,需要他们代表时间的范围。
Date –> LocalDate/LocalTime/LocalDateTime
1 2 3 4 5 6
| Date date = new Date(); Instant instant = date.toInstant(); ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); LocalDate localDate = localDateTime.toLocalDate(); LocalTime localTime = localDateTime.toLocalTime();
|
LocalDate/LocalTime/LocalDateTime –> Date
1 2 3 4
| LocalDateTime localDateTime = LocalDateTime.now(); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant);
|
1 2 3 4
| LocalDate localDate = LocalDate.now(); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDate.atStartOfDay().atZone(zone).toInstant(); Date date = Date.from(instant);
|
1 2 3 4 5 6 7
| LocalTime localTime = LocalTime.now(); LocalDate localDate = LocalDate.now(); LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); LocalDateTime localDateTime1 = LocalDateTime.now(); ZoneId zone = ZoneId.systemDefault(); Instant instant = localDateTime.atZone(zone).toInstant(); Date date = Date.from(instant);
|
计算两个时间差
1 2 3 4
| LocalDateTime now = LocalDateTime.now(); LocalDateTime start = now.minusDays(5); Duration duration = Duration.between(start,now); System.out.println(duration.toDays());
|
Instant
Instant代表某个时间,类似于java.util.Date
,它是精确到纳秒的(而不是象旧版本的Date精确到毫秒)。如果使用Long去表示,其中的存储空间是不够的,不能像data那样直接使用一个long类型表示时间戳。其实在Instant中,它的源码就是分成两部分组成的。
1 2 3 4 5
| private Instant(long epochSecond, int nanos) { super(); this.seconds = epochSecond; this.nanos = nanos; }
|
Instant和上面介绍的时间类一样,提供了很多的方法。简单的介绍点。
1 2 3 4 5 6 7 8 9 10
| public static void main(String[] args) { Instant instant = Instant.now(); System.out.println(instant); Instant time = Instant.ofEpochMilli(new Date().getTime()); instant = Instant.parse("1995-10-23T10:12:35Z"); instant.plus(Duration.ofHours(5).plusMinutes(4)); }
|
Reference