特性:速度更快、代码更少,强大的Stream API、便于并行、最大化减少空指针异常 Optional。核心为Lambda表达式和Stream API,总共分为以下几个部分:
Java8之前的库对日期和时间的支持并不是很好,比如SimpleDateFormat不支持多线程,为了解决这些问题,Java8引入了一套全新的时间日期API,位于java.time包,更加系统规范,更好用。
日期和时间,以 LocalDateTime 为例
@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()); }
计算机识别的时间,(UTC时间)以Unix元年 1970年1月1日 00:00:00.000到某个时间之间的毫秒值。
整个地球分为二十四时区,每个时区都有自己的本地时间。
在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。
@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); }
@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()); }
@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()); }
@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); }
@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); }
@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); }