众所周知,JDK8以前使用日期主要是Date类,以及Calendar类,同时,也有一部分用户使用的是joda工具包Joda官网,现在JDK1.8将Joda部分特性以及工具类集成到了1.8中,下面就来简单介绍。
它主要是在 java.time 包下。
核心:
- chrono :这个包为非ISO的日历系统定义了一些泛化的API。
- format : 这个包主要是格式化日期的各类API。
- temporal :一部分静态API,用于找到一些特定的日期的API。
- zone : 包含各种支持的时区的API。
常用的几个类:
LocalTime 仅包含时分秒毫秒:22:02:18.668
LocalDate 仅包含日期: 2019-06-02
LocalDateTime 包含日期+时分秒 2019-06-02T22:02:18.668
Instant 时间戳 2019-06-02T14:02:18.668Z
注意:通过这种方式获取的时间戳是英国格林尼治时间,与中国的时区的时差是相差八小时,即 北京时间=格林尼治时间+8小时。
这里也可以使用调整ZoneId的方式,来修改当前的时区。
ZoneId shanghaiTimeZone = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = Instant.now().atZone(shanghaiTimeZone);
国际时区 TimeZone ID列表
TemporalAdjusters 提供了大量API,获取到指定的特殊日期
Period 将一个时间或两个时间转为具体的时期(年,月,日,小时,分钟)
DateTimeFormatter 根据传入的pattern格式化日期。
用法
1.格式化输出时间
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDateTime now = LocalDateTime.now(); String nowStr = now.format(dateTimeFormatter); System.out.println(nowStr);
2.求出两个时间相差多少年,多少天,多少小时,多少分
//这种比较仅针对每一项单独的比较 LocalDate localDate = LocalDate.of(1999,12,31); LocalDate now = LocalDate.now(); Period between = Period.between(localDate, now); System.out.println("相距"+between.getYears()+"年"); System.out.println("相距"+between.getMonths()+"月"); System.out.println("相距"+between.getDays()+"日"); // 直接使用日期类中的方法计算日期间隔 long years = localDate.until(now, ChronoUnit.YEARS); System.out.println("间隔的年数:" + years); long months = localDate.until(now, ChronoUnit.MONTHS); System.out.println("间隔的月数:" + months); long days = localDate.until(now, ChronoUnit.DAYS); System.out.println("间隔的天数:" + days); long weeks = localDate.until(now, ChronoUnit.WEEKS); System.out.println("间隔的周数:" + weeks);
结果:
相距19年
相距5月
相距2日
----------------------
间隔的年数:19
间隔的月数:233
间隔的天数:7093
间隔的周数:10133.求出当前月的第一天,当前时间的这一年最后一天,当前时间下一年的第一天
LocalDateTime now = LocalDateTime.now(); System.out.println("当前时间:"+now); //当前时间月的第一天 LocalDateTime firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth()); System.out.println("当前时间月的第一天:"+firstDayOfMonth); //当前时间年的最后一天 LocalDateTime lastDayOfYear = now.with(TemporalAdjusters.lastDayOfYear()); System.out.println("当前时间年的最后一天:"+lastDayOfYear); LocalDateTime firstDayOfNextYear = now.with(TemporalAdjusters.firstDayOfNextYear()); System.out.println("当前时间下一年的第一天:"+firstDayOfNextYear);
结果:
当前时间:2019-06-02T23:23:15.295
当前时间月的第一天:2019-06-01T23:23:15.295
当前时间年的最后一天:2019-12-31T23:23:15.295
当前时间下一年的第一天:2020-01-01T23:23:15.295
未完
参考: