JDK1.8除了新增了lambda表达式、stream流之外,它还新增了全新的日期时间API。在JDK1.8之前,Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。因此推出了java.time包,该包下的所有类都是不可变类型而且线程安全。
关键类Instant:瞬时时间。
LocalDate:本地日期,不包含具体时间, 格式 yyyy-MM-dd。
LocalTime:本地时间,不包含日期. 格式 yyyy-MM-dd HH:mm:ss.SSS 。
LocalDateTime:组合了日期和时间,但不包含时差和时区信息。
ZonedDateTime:最完整的日期时间,包含时区和相对UTC或格林威治的时差。
使用1.获取当前的日期时间
通过静态工厂方法now()来获取当前时间。
//本地日期,不包括时分秒 LocalDate nowDate = LocalDate.now(); //本地日期,包括时分秒 LocalDateTime nowDateTime = LocalDateTime.now(); System.out.println("当前时间:"+nowDate); System.out.println("当前时间:"+nowDateTime); // 当前时间:2018-12-19 // 当前时间:2018-12-19T15:24:35.8222.获取当前的年月日时分秒
获取时间之后,直接get获取年月日时分秒。
//获取当前的时间,包括毫秒 LocalDateTime ldt = LocalDateTime.now(); System.out.println("当前年:"+ldt.getYear()); //2018 System.out.println("当前年份天数:"+ldt.getDayOfYear());//172 System.out.println("当前月:"+ldt.getMonthValue()); System.out.println("当前时:"+ldt.getHour()); System.out.println("当前分:"+ldt.getMinute()); System.out.println("当前时间:"+ldt.toString()); // 当前年:2018 // 当前年份天数:353 // 当前月:12 // 当前时:15 // 当前分:24 // 当前时间:2018-12-19T15:24:35.8333.格式化时间
格式时间格式需要用到DateTimeFormatter类。
LocalDateTime ldt = LocalDateTime.now(); System.out.println("格式化时间: "+ ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))); //格式化时间:2018-12-19 15:37:47.1194.时间增减
在指定的时间进行增加/减少年月日时分秒。
LocalDateTime ldt = LocalDateTime.now(); System.out.println("后5天时间:"+ldt.plusDays(5)); System.out.println("前5天时间并格式化:"+ldt.minusDays(5).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); //2018-06-16 System.out.println("前一个月的时间:"+ldt2.minusMonths(1).format(DateTimeFormatter.ofPattern("yyyyMM"))); //2018-06-16 System.out.println("后一个月的时间:"+ldt2.plusMonths(1)); //2018-06-16 System.out.println("指定2099年的当前时间:"+ldt.withYear(2099)); //2099-06-21T15:07:39.506 // 后5天时间:2018-12-24T15:50:37.508 // 前5天时间并格式化:2018-12-14 // 前一个月的时间:201712 // 后一个月的时间:2018-02-04T09:19:29.499 // 指定2099年的当前时间:2099-12-19T15:50:37.5085.创建指定时间
通过指定年月日来创建。
LocalDate ld3=LocalDate.of(2017, Month.NOVEMBER, 17); LocalDate ld4=LocalDate.of(2018, 02, 11);6.时间相差比较
比较相差的年月日时分秒。
示例一: 具体相差的年月日
LocalDate ld=LocalDate.parse("2017-11-17"); LocalDate ld2=LocalDate.parse("2018-01-05"); Period p=Period.between(ld, ld2); System.out.println("相差年: "+p.getYears()+" 相差月 :"+p.getMonths() +" 相差天:"+p.getDays()); // 相差年: 0 相差月 :1 相差天:19注:这里的月份是不满足一年,天数是不满足一个月的。这里实际相差的是1月19天,也就是49天。
示例二:相差总数的时间
ChronoUnit 日期周期单位的标准集合。
LocalDate startDate = LocalDate.of(2017, 11, 17); LocalDate endDate = LocalDate.of(2018, 01, 05); System.out.println("相差月份:"+ChronoUnit.MONTHS.between(startDate, endDate)); System.out.println("两月之间的相差的天数 : " + ChronoUnit.DAYS.between(startDate, endDate)); // 相差月份:1 // 两天之间的差在天数 : 49注:ChronoUnit也可以计算相差时分秒。
示例三:精度时间相差
Duration 这个类以秒和纳秒为单位建模时间的数量或数量。
Instant inst1 = Instant.now(); System.out.println("当前时间戳 : " + inst1); Instant inst2 = inst1.plus(Duration.ofSeconds(10)); System.out.println("增加之后的时间 : " + inst2); System.out.println("相差毫秒 : " + Duration.between(inst1, inst2).toMillis()); System.out.println("相毫秒 : " + Duration.between(inst1, inst2).getSeconds()); // 当前时间戳 : 2018-12-19T08:14:21.675Z // 增加之后的时间 : 2018-12-19T08:14:31.675Z // 相差毫秒 : 10000 // 相毫秒 : 10