众所周知,Java 8之前的日期时间API非常糟糕,故在Java 8中重新设计了日期、时间类。具体地,包括LocalDate、LocalTime、LocalDateTime等
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方法更加人性化
调整日期
在修改日期方面,支持通过链式调用的方式对日期进行加、减
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) .plus(1, MONTHS) .plus( -3, YEARS );
LocalDate localDate3 = localDate1.plusDays(5) .plusMonths(1) .plusYears(-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) .minus(-2, MONTHS) .minus( 22, YEARS ); LocalDate localDate6 = localDate4.minusDays(7) .minusMonths(-2) .minusYears(22);
System.out.println("localDate 4 :" + localDate4); System.out.println("localDate 5 :" + localDate5); System.out.println("localDate 6 :" + localDate6);
LocalDate localDate7 = localDate4.plusMonths(24); System.out.println("localDate 7 :" + localDate7); }
|
测试结果如下所示
同样,还支持按绝对量进行日期的修改调整
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); LocalDate localDate2 = localDate1.withYear(2020); LocalDate localDate3 = localDate1.withMonth(11); 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); }
|
测试结果如下所示
比较日期
当比较两个日期、计算日期间隔也非常方便
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); }
|
测试结果如下所示
格式化
在格式化方面,借助于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); }
|
测试结果如下所示
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); }
|
测试结果如下所示
调整时间
在修改时间方面,支持通过链式调用的方式对时间进行加、减
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) .plus(14, MINUTES) .plus(1, HOURS); LocalTime localTime3 = localTime1.plusSeconds(2) .plusMinutes(14) .plusHours(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) .minus(16, MINUTES) .minus(9, HOURS); LocalTime localTime6 = localTime4.minusSeconds(7) .minusMinutes(16) .minusHours(9); System.out.println("localTime 4 :" + localTime4); System.out.println("localTime 5 :" + localTime5); System.out.println("localTime 6 :" + localTime6); }
|
测试结果如下所示
同样,还支持按绝对量进行时间的修改调整
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) .withMinute(43) .withSecond(58);
System.out.println("localTime 1 :" + localTime1); System.out.println("localTime 2 :" + localTime2); }
|
测试结果如下所示
比较时间
当比较两个时间、计算时间间隔也非常方便
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); }
|
测试结果如下所示
格式化
在格式化方面,借助于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); }
|
测试结果如下所示
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); }
|
测试结果如下所示
调整
日期、时间修改同样支持绝对、相对两种形式
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) .plusMonths(5) .minusDays(10) .minusHours(3) .plusMinutes(2) .plusSeconds(15); System.out.println("localDateTime 2 :" + localDateTime2);
LocalDateTime localDateTime3 = localDateTime1.withYear(1998) .withMonth(11) .withDayOfMonth(29) .withHour(23) .withMinute(58) .withSecond(59); System.out.println("localDateTime 3 :" + localDateTime3); }
|
测试结果如下所示
比较
日期比较也是类似地
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); }
|
测试结果如下所示
格式化
在格式化方面,借助于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); }
|
测试结果如下所示