Java 8之日期时间API

众所周知,Java 8之前的日期时间API非常糟糕,故在Java 8中重新设计了日期、时间类。具体地,包括LocalDate、LocalTime、LocalDateTime等

abstract.jpeg

LocalDate

LocalDate类只负责处理日期,其不包含时区

实例化

其提供了多种形式的静态方法用于创建实例,示例如下所示

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 init() {
LocalDate localDate1 = LocalDate.now();
LocalDate localDate2 = LocalDate.from( localDate1 );
System.out.println("localDate 1 :" + localDate1);
System.out.println("localDate 2 : Year: "+localDate2.getYear()+", Month: "+localDate2.getMonthValue()+", Day: "+localDate2.getDayOfMonth());

LocalDate localDate3 = LocalDate.of(2000,10,1);
LocalDate localDate4 = LocalDate.ofYearDay(2001,41);
System.out.println("localDate 3 :" + localDate3);
System.out.println("localDate 4 :" + localDate4);

LocalDate localDate5 = LocalDate.parse("2002-03-04");
LocalDate localDate6 = LocalDate.parse("30-12-2003", DateTimeFormatter.ofPattern("dd-MM-yyyy"));
System.out.println("localDate 5 :" + localDate5);
System.out.println("localDate 6 :" + localDate6);

LocalDate localDate7 = LocalDate.ofEpochDay(1);
LocalDate localDate8 = LocalDate.ofEpochDay(0);
LocalDate localDate9 = LocalDate.ofEpochDay(-1);

System.out.println("localDate 7 :" + localDate7);
System.out.println("localDate 8 :" + localDate8);
System.out.println("localDate 9 :" + localDate9);
}

从测试结果不难看出,其toString方法更加人性化

figure 1.jpeg

调整日期

在修改日期方面,支持通过链式调用的方式对日期进行加、减

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
/**
* 日期调整
*/
@Test
public void adjust1() {
LocalDate localDate1 = LocalDate.parse("2000-10-15");
LocalDate localDate2 = localDate1.plus(5, DAYS) // 日期 增加 5
.plus(1, MONTHS) // 月份 增加 1
.plus( -3, YEARS ); // 年份 增加 -3

LocalDate localDate3 = localDate1.plusDays(5) // 日期 增加 5
.plusMonths(1) // 月份 增加 1
.plusYears(-3); // 年份 增加 -3

System.out.println("localDate 1 :" + localDate1);
System.out.println("localDate 2 :" + localDate2);
System.out.println("localDate 3 :" + localDate3);

LocalDate localDate4 = LocalDate.parse("2022-08-27");
LocalDate localDate5 = localDate4.minus(7, DAYS) // 日期 减少 7
.minus(-2, MONTHS) // 月份 减少 -2
.minus( 22, YEARS ); // 年份 减少 22
LocalDate localDate6 = localDate4.minusDays(7) // 日期 减少 7
.minusMonths(-2) // 月份 减少 -2
.minusYears(22); // 年份 减少 22

System.out.println("localDate 4 :" + localDate4);
System.out.println("localDate 5 :" + localDate5);
System.out.println("localDate 6 :" + localDate6);

// 增加24个月, 即增加2年
LocalDate localDate7 = localDate4.plusMonths(24);
System.out.println("localDate 7 :" + localDate7);
}

测试结果如下所示

figure 2.jpeg

同样,还支持按绝对量进行日期的修改调整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 日期调整
*/
@Test
public void adjust2() {
LocalDate localDate1 = LocalDate.of(2018, 3, 15);
// 将年份改为2020年
LocalDate localDate2 = localDate1.withYear(2020);
// 将月份改为11年
LocalDate localDate3 = localDate1.withMonth(11);
// 将日期改为29号
LocalDate localDate4 = localDate1.withDayOfMonth(29);

System.out.println("localDate1 : " + localDate1);
System.out.println("localDate2 : " + localDate2);
System.out.println("localDate3 : " + localDate3);
System.out.println("localDate4 : " + localDate4);
}

测试结果如下所示

figure 3.jpeg

比较日期

当比较两个日期、计算日期间隔也非常方便

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
/**
* 日期比较
*/
@Test
public void compare() {
LocalDate localDate1 = LocalDate.parse("2000-10-15");
LocalDate localDate2 = LocalDate.parse("2000-10-15");

if( localDate1.equals(localDate2) ) {
System.out.println("localDate 1, localDate 2 日期相同");
}

LocalDate localDate3 = LocalDate.parse("2008-09-11");
LocalDate localDate4 = LocalDate.parse("2008-09-25");

if( localDate3.isBefore(localDate4) ) {
System.out.println("localDate 3 早于 localDate 4");
}

if( localDate4.isAfter(localDate3) ) {
System.out.println("localDate 4 晚于 localDate 3");
}

// 计算两个日期的间隔
Period period1 = Period.between(localDate3, localDate4);
Period period2 = Period.between(localDate4, localDate3);
int days1 = period1.getDays();
int days2 = period2.getDays();
System.out.println("days 1: "+days1);
System.out.println("days 2: "+days2);
}

测试结果如下所示

figure 4.jpeg

格式化

在格式化方面,借助于DateTimeFormatter可以很方便实现

1
2
3
4
5
6
7
8
9
10
11
/**
* 格式化
*/
@Test
public void convert() {
LocalDate localDate1 = LocalDate.parse("30/12/2003", DateTimeFormatter.ofPattern("dd/MM/yyyy"));
System.out.println("localDate 1 :" + localDate1);

String str = localDate1.format(DateTimeFormatter.ofPattern("yyyy~MM-dd"));
System.out.println("str: " + str);
}

测试结果如下所示

figure 5.png

LocalTime

LocalTime类只负责处理时间信息

实例化

其提供了多种形式的静态方法用于创建实例,示例如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 实例化
*/
@Test
public void init() {
LocalTime localTime1 = LocalTime.now();
LocalTime localTime2 = LocalTime.from( localTime1 );
System.out.println("localTime 1 :" + localTime1);
System.out.println("localTime 2 : Hour: "+localTime1.getHour()+", Min: "+localTime2.getMinute()+", Sec: "+localTime2.getSecond());


LocalTime localTime3 = LocalTime.of(14, 34);
LocalTime localTime4 = LocalTime.of(14, 34, 22);
System.out.println("localTime 3 :" + localTime3);
System.out.println("localTime 4 :" + localTime4);

LocalTime localTime5 = LocalTime.parse("21:46:39");
LocalTime localTime6 = LocalTime.parse("23/58/03", DateTimeFormatter.ofPattern("HH/mm/ss"));
System.out.println("localTime 5 :" + localTime5);
System.out.println("localTime 6 :" + localTime6);
}

测试结果如下所示

figure 6.jpeg

调整时间

在修改时间方面,支持通过链式调用的方式对时间进行加、减

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
/**
* 时间调整
*/
@Test
public void adjust1() {
LocalTime localTime1 = LocalTime.parse("21:46:39");
LocalTime localTime2 = localTime1.plus(2, SECONDS) // 秒钟增加 2
.plus(14, MINUTES) // 分钟增加 14
.plus(1, HOURS); // 时钟增加 1
LocalTime localTime3 = localTime1.plusSeconds(2) // 秒钟增加 2
.plusMinutes(14) // 分钟增加 14
.plusHours(1); // 时钟增加 1
System.out.println("localTime 1 :" + localTime1);
System.out.println("localTime 2 :" + localTime2);
System.out.println("localTime 3 :" + localTime3);

LocalTime localTime4 = LocalTime.parse("19:36:27");
LocalTime localTime5 = localTime4.minus(7, SECONDS) // 秒钟减少 7
.minus(16, MINUTES) // 分钟减少 16
.minus(9, HOURS); // 时钟减少 9
LocalTime localTime6 = localTime4.minusSeconds(7) // 秒钟减少 7
.minusMinutes(16) // 分钟减少 16
.minusHours(9); // 时钟减少 9
System.out.println("localTime 4 :" + localTime4);
System.out.println("localTime 5 :" + localTime5);
System.out.println("localTime 6 :" + localTime6);
}

测试结果如下所示

figure 7.jpeg

同样,还支持按绝对量进行时间的修改调整

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 时间调整
*/
@Test
public void adjust2() {
LocalTime localTime1 = LocalTime.parse("13:27:39");
LocalTime localTime2 = localTime1.withHour(18) // 将时钟改为18点
.withMinute(43) // 将分钟改为43分
.withSecond(58); // 将秒钟改为58秒

System.out.println("localTime 1 :" + localTime1);
System.out.println("localTime 2 :" + localTime2);
}

测试结果如下所示

figure 8.jpeg

比较时间

当比较两个时间、计算时间间隔也非常方便

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
/**
* 时间比较
*/
@Test
public void compare() {
LocalTime localTime1 = LocalTime.parse("21:18:42");
LocalTime localTime2 = LocalTime.parse("21:18:42");
if( localTime1.equals(localTime2) ) {
System.out.println("localTime 1, localTime 2 时间相同");
}

LocalTime localTime3 = LocalTime.parse("11:18:42");
LocalTime localTime4 = LocalTime.parse("11:38:22");
if( localTime3.isBefore(localTime4) ) {
System.out.println("localTime 3 早于 localTime 4");
}
if( localTime4.isAfter(localTime3) ) {
System.out.println("localTime 4 晚于 localTime 3");
}

LocalTime localTime5 = LocalTime.parse("11:08:22");
LocalTime localTime6 = LocalTime.parse("21:58:42");

Duration between1 = Duration.between(localTime5, localTime6);
long hour = between1.toHours();
long minute = between1.toMinutes();
long second = between1.toSeconds();
System.out.println("between1: " + between1);
System.out.println("hour: "+hour+", minute: "+minute+", second: "+second);

Duration between2 = Duration.between(localTime6, localTime5);
hour = between2.toHours();
minute = between2.toMinutes();
second = between2.toSeconds();
System.out.println("between2: " + between2);
System.out.println("hour: "+hour+", minute: "+minute+", second: "+second);
}

测试结果如下所示

figure 9.jpeg

格式化

在格式化方面,借助于DateTimeFormatter可以很方便实现

1
2
3
4
5
6
7
8
9
10
11
@Test
public void convert() {
LocalTime localTime1 = LocalTime.parse("23/58/03", DateTimeFormatter.ofPattern("HH/mm/ss"));
System.out.println("localTime 1 :" + localTime1);

String str1 = localTime1.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
System.out.println("str1: " + str1);

String str2 = localTime1.format(DateTimeFormatter.ofPattern("HH~mm~ss"));
System.out.println("str2: " + str2);
}

测试结果如下所示

figure 10.jpeg

LocalDateTime

LocalDateTime类则是LocalDate、LocalTime类的组合,可以实现同时表达日期、时间

实例化

实例化方式如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 实例化
*/
@Test
public void init() {
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime2 = LocalDateTime.from( localDateTime1 );
System.out.println("localDateTime 1 :" + localDateTime1);
System.out.println("localDateTime 2 : Year: "+localDateTime2.getYear()+", Month: "+localDateTime2.getMonthValue()+", Day: "+localDateTime2.getDayOfMonth()
+", Hour: "+localDateTime2.getHour()+", Min: "+localDateTime2.getMinute()+", Sec: "+localDateTime2.getSecond());

LocalDate localDate = LocalDate.of(2008,10,1);
LocalTime localTime = LocalTime.of(20,8,30);
LocalDateTime localDateTime3 = LocalDateTime.of(localDate, localTime);
System.out.println("localDateTime 3 :" + localDateTime3);

LocalDateTime localDateTime4 = LocalDateTime.of(2008,10,1,20,8,30);
System.out.println("localDateTime 4 :" + localDateTime4);

LocalDateTime localDateTime5 = LocalDateTime.parse("2018-03-15T10:38:25");
LocalDateTime localDateTime6 = LocalDateTime.parse("03/15/2018 10:38:25", DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss"));
System.out.println("localDateTime 5 :" + localDateTime5);
System.out.println("localDateTime 6 :" + localDateTime6);
}

测试结果如下所示

figure 11.jpeg

调整

日期、时间修改同样支持绝对、相对两种形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void adjust() {
LocalDateTime localDateTime1 = LocalDateTime.parse("2018-03-15T10:38:25");
System.out.println("localDateTime 1 :" + localDateTime1);

LocalDateTime localDateTime2 = localDateTime1.plusYears(100) // 年份 增加100
.plusMonths(5) // 月份 增加 5
.minusDays(10) // 日期 减少 10
.minusHours(3) // 时钟 减少 3
.plusMinutes(2) // 分钟 增加 2
.plusSeconds(15); // 秒钟 增加 15
System.out.println("localDateTime 2 :" + localDateTime2);

LocalDateTime localDateTime3 = localDateTime1.withYear(1998) // 将年份改为1998年
.withMonth(11) // 将月份改为11月
.withDayOfMonth(29) // 将日期改为29日
.withHour(23) // 将时钟改为23
.withMinute(58) // 将分钟改为58
.withSecond(59); // 将秒钟改为59
System.out.println("localDateTime 3 :" + localDateTime3);
}

测试结果如下所示

figure 12.png

比较

日期比较也是类似地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

@Test
public void compare() {
LocalDateTime localDateTime1 = LocalDateTime.parse("2018-03-15T10:38:25");
LocalDateTime localDateTime2 = LocalDateTime.parse("2018-03-15T10:38:25");
if( localDateTime1.equals(localDateTime2) ) {
System.out.println("localDateTime 1, localDateTime 2 时间相同");
}

LocalDateTime localDateTime3 = LocalDateTime.parse("2018-02-15T10:38:25");
LocalDateTime localDateTime4 = LocalDateTime.parse("2018-08-15T10:38:25");
if( localDateTime3.isBefore(localDateTime4) ) {
System.out.println("localDateTime 3 早于 localDateTime 4");
}
if( localDateTime4.isAfter(localDateTime3) ) {
System.out.println("localDateTime 4 晚于 localDateTime 3");
}

Duration between1 = Duration.between(localDateTime3, localDateTime4);
long day = between1.toDays();
long minute = between1.toMinutes();
System.out.println("between1: " + between1);
System.out.println("day: "+day+", minute: "+minute);
}

测试结果如下所示

figure 13.jpeg

格式化

在格式化方面,借助于DateTimeFormatter可以很方便实现

1
2
3
4
5
6
7
8
9
10
11
12

@Test
public void convert() {
LocalDateTime localDateTime1 = LocalDateTime.parse("03/15/2018--10:38:25", DateTimeFormatter.ofPattern("MM/dd/yyyy--HH:mm:ss"));
System.out.println("localDateTime 1 :" + localDateTime1);

String str1 = localDateTime1.format( DateTimeFormatter.ofPattern("yyyy~MM~dd HH/mm/ss") );
System.out.println("str1: " + str1);

String str2 = localDateTime1.format( DateTimeFormatter.ofPattern("yyyy~MM~dd") );
System.out.println("str2: " + str2);
}

测试结果如下所示

figure 14.jpeg

0%