blackcat

java8新特性

特性:速度更快、代码更少,强大的Stream API、便于并行、最大化减少空指针异常 Optional。核心为Lambda表达式和Stream API,总共分为以下几个部分:

  1. Lambda表达式
  2. 函数式接口
  3. 方法引用与构造器引用
  4. Stream API
  5. 接口中的默认方法与静态方法
  6. 新时间日期API
  7. 其他新特性

时间日期API

Java8之前的库对日期和时间的支持并不是很好,比如SimpleDateFormat不支持多线程,为了解决这些问题,Java8引入了一套全新的时间日期API,位于java.time包,更加系统规范,更好用。

时间和日期

日期和时间,以 LocalDateTime 为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Test
public void test01() {
// 调用静态方法now 就可以获取 LocalDateTime实例
LocalDateTime localDateTime = LocalDateTime.now();
// 获取当前日期 2019-11-28T23:57:03.073
System.out.println(localDateTime);
// 当前年份 // 2019
System.out.println(localDateTime.getYear());
// 当前月 返回英文单词 NOVEMBER
System.out.println(localDateTime.getMonth());
// 当前月的 数字 11
System.out.println(localDateTime.getMonthValue());
// 当前月的第几天 28
System.out.println(localDateTime.getDayOfMonth());
// 当前周 周几 返回 英文单词 THURSDAY
System.out.println(localDateTime.getDayOfWeek());
// 当前年 第多少天 332
System.out.println(localDateTime.getDayOfYear());
// 当前 时 23
System.out.println(localDateTime.getHour());
// 当前 分 57
System.out.println(localDateTime.getMinute());
// 当前 秒 3
System.out.println(localDateTime.getSecond());
}

时间戳 Instant

计算机识别的时间,(UTC时间)以Unix元年 1970年1月1日 00:00:00.000到某个时间之间的毫秒值。
整个地球分为二十四时区,每个时区都有自己的本地时间。
在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test02() {
// 默认获取 UTC时区 2019-11-28T15:59:23.429Z
Instant instant = Instant.now();
System.out.println(instant);
// 偏移量8个小时 东八区时间 2019-11-28T23:59:23.429+08:00
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
// 获取 1970年1月1日 00:00:00.000 到现在的毫秒值 1574956763429
System.out.println(instant.toEpochMilli());
// 获取 1970年1月1日 00:00:00.000 加60秒的时间 1970-01-01T00:01:00Z
Instant instant2 = Instant.ofEpochSecond(60);
System.out.println(instant2);
}

时间间隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
public void test03() {
// Instant间隔
Instant instant1 = Instant.now();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Instant instant2 = Instant.now();

Duration duration1 = Duration.between(instant1, instant2);
// 秒
System.out.println(duration1.toMillis());

// LocalDateTime间隔
LocalDateTime localDateTime1 = LocalDateTime.now();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LocalDateTime localDateTime2 = LocalDateTime.now();
Duration duration2 = Duration.between(localDateTime1, localDateTime2);
// 秒
System.out.println(duration2.toMillis());

}

日期间隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Test
public void test04() {
// 设置一个具体时间 2016-09-18
LocalDate localDate1 = LocalDate.of(2016, 9, 18);
System.out.println(localDate1);
// 当前时间 2019-11-29
LocalDate localDate2 = LocalDate.now();
System.out.println(localDate2);
// 相隔的时间 从年开始 几年几个月几天
Period period = Period.between(localDate1, localDate2);
// [Years, Months, Days] P3Y2M11D
System.out.println(period);
// 11天
System.out.println(period.getDays());
// 2个月
System.out.println(period.getMonths());
// 3年
System.out.println(period.getYears());
}

TemporalAdjuster 时间校正器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Test
public void test05() {
//2019-11-29T00:07:33.689
LocalDateTime localDateTime1 = LocalDateTime.now();
System.out.println(localDateTime1);

// 指定 具体时间 这个月几号 2019-11-10T00:07:33.689
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(10);
System.out.println(localDateTime2);

// 指定 具体时间 下一个周一 2019-12-02T00:07:33.689
LocalDateTime localDateTime3 = localDateTime1.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println(localDateTime3);

// 计算下一个工作日
// with(TemporalAdjuster temporalAdjuster) 可以传入lambda表达式
LocalDateTime localDateTime4 = localDateTime1.with((t) -> {
LocalDateTime localDateTime = (LocalDateTime) t;
// 获取周几
DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
// 如果是周五 加3天
if (dayOfWeek.equals(DayOfWeek.FRIDAY)) {
// 加3天
return localDateTime.plusDays(3);
// 如果是周六 加2天

} else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) {
return localDateTime.plusDays(2);
// 其他情况 加1天

} else {
return localDateTime.plusDays(1);

}
});
// 2019-12-02T00:07:33.689
System.out.println(localDateTime4);

}

时间格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void test06() {
// 默认提供的解析格式 DateTimeFormatter.ISO_DATE
DateTimeFormatter formatter1 = DateTimeFormatter.ISO_DATE_TIME;

LocalDateTime localDateTime = LocalDateTime.now();
// 2019-11-29T00:08:32.92
String timeStr1 = formatter1.format(localDateTime);
System.out.println(timeStr1);


// 自定义解析格式
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
// 格式化字符串 2019年11月29日 00:08:32
String timeStr2 = formatter2.format(localDateTime);
System.out.println(timeStr2);

LocalDateTime localDateTime2 = LocalDateTime.parse(timeStr2, formatter2);
// 解析为LocalDateTime格式 2019-11-29T00:08:32
System.out.println(localDateTime2);
}

时区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void test07() {

Set<String> set = ZoneId.getAvailableZoneIds();
// 输出所有的时区
for (String zone : set) {
System.out.println(zone);
}

LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Aqtau"));
// Asia/Aqtau 时区 的当前时间 2019-11-28T21:10:39.353
System.out.println(localDateTime);

LocalDateTime localDateTime2 = LocalDateTime.now();
// 构建带有时区的时间 上海 2019-11-29T00:10:39.359+08:00[Asia/Shanghai]
ZonedDateTime zonedDateTime = localDateTime2.atZone(ZoneId.of("Asia/Shanghai"));

System.out.println(zonedDateTime);


}

 评论