Java8 新的日期和时间 API
jopen
9年前
时间线
在 Java 当中,一个 Instant 对象表示时间轴上的一个点。并且我们可以计算两个时间点之间的时间量。
@Test public void test1() throws Exception { // Instant.now() 获取当前时间瞬时点 Instant begin = Instant.now(); System.out.println(begin); Thread.sleep(200); Instant end = Instant.now(); System.out.println(end); // Duration表示两个瞬时点之间的持续时间 Duration duration = Duration.between(begin, end); System.out.println(duration.toMillis()); // 可以对 Duration 和 Instant 进行数学操作 System.out.println(end.plusSeconds(20)); System.out.println(duration.plusMillis(500).toMillis()); }
本地日期
本地日期/时间表示一个日期或时间,但是不关联任何时区信息。
@Test public void test2() { // LocalDate.now() 获取本地今天日期 LocalDate localDate = LocalDate.now(); System.out.println(localDate); // LocalDate.of() 创建日期 2015-12-22 LocalDate localDate2 = LocalDate.of(2015, 12, 22); System.out.println(localDate2); System.out.println(localDate2.plusDays(1)); System.out.println(localDate.isBefore(localDate2)); LocalDate localDate3 = localDate2.plus(Period.ofDays(3)); System.out.println(localDate.isBefore(localDate3)); System.out.println(localDate2.until(localDate3, ChronoUnit.DAYS));//返回两个本地日期时间的距离 System.out.println(localDate3.getDayOfWeek());//星期几 }
两个瞬时点 Instant 之间的距离就是一个持续时间 Duration。对于本地日期对应的对象就是时段 Period。
日期校正器
如果我们需要进行调度,例如每个月的第一个周二这样的日期。 TemporalAdjusters 类提供了很多静态方法来进行常用的校正。
@Test public void test3() { LocalDate localDate = LocalDate.of(2015, 1, 1).with( TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));// 从指定日期开始的后一个星期几 System.out.println(localDate); LocalDate localDate2 = localDate.with(TemporalAdjusters.previous(DayOfWeek.TUESDAY));// 指定日期的前一个星期几 LocalDate localDate3 = localDate.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));// 指定日期的后一个星期几 System.out.println(localDate2); System.out.println(localDate3); LocalDate localDate4 = localDate.with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.TUESDAY));// 第三个周二 System.out.println(localDate4); LocalDate localDate5 = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.TUESDAY)); System.out.println(localDate5); TemporalAdjuster Next_WorkDay = w -> {//自定义校正器 LocalDate resultDate = (LocalDate) w; do { resultDate = resultDate.plusDays(1); } while (resultDate.getDayOfWeek().getValue() >= 6); return resultDate; }; }
本地时间
LocalTime 表示一天当中的某个时间,例如 15:00.
@Test public void test4() { LocalTime localTime = LocalTime.now(); LocalTime localTime2 = LocalTime.of(12, 24); System.out.println(localTime); System.out.println(localTime2); // 其他 api 与 LocalDate 类似 LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime2 = LocalDateTime.of(2015, 12, 22, 3, 14, 23); System.out.println(localDateTime); System.out.println(localDateTime2); // 其他 api 与 LocalDate 类似 }
格式化和解析
DateTimeFormatter 提供了三种格式化的方法来打印日期:
- 预定义的标准格式
- 语言相关的格式
- 自定义格式
@Test public void test5() { LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(localDateTime));// 预定义标准格式 System.out.println(DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(localDateTime));// 预定义标准格式 System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL) .format(localDateTime));// 语言相关格式 System.out.println(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).format( localDateTime));// 语言相关格式 System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).format( localDateTime));// 语言相关格式 System.out.println(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).format( localDateTime));// 语言相关格式,一般使用这个 System.out .println(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(localDateTime));// 自定义 }
遗留代码操作
Instant 类似于 java.util.Date 类,在 java8 当中 java.util.Date 新增两个方法:toInstant,还有 from 方法来相互转换。
【参考资料】
---EOF---