0%

Java8中的时间

相比较于之前的版本之前的版本,增加了很大新特性,其中关于时间多了很多功能: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);//转化成LocalDateTime
LocalDate localDate = localDateTime.toLocalDate();//转化成LocalDate
LocalTime localTime = localDateTime.toLocalTime();//转化成LocalTime

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);
//将java.util.Date转换为Instant
Instant time = Instant.ofEpochMilli(new Date().getTime());
//从字符串类型中创建Instant类型的时间
instant = Instant.parse("1995-10-23T10:12:35Z");
//将现在的时间加上5个小时4分钟
instant.plus(Duration.ofHours(5).plusMinutes(4));
}

Reference

客官,赏一杯coffee嘛~~~~