jdk|jdk 8 特性 - 新时间日期,其他

6. 新时间日期 API 6.1.简介 使用 LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前的时间信息。也不包含与时区相关的信息.
6.2 api jdk|jdk 8 特性 - 新时间日期,其他
文章图片
时间api
//创建时间方式 LocalDateTime ldt = LocalDateTime.now(); System.out.println(ldt); LocalDateTime of = LocalDateTime.of(2018, 12, 20, 21, 33, 11); System.out.println(of); //加一年 LocalDateTime localDateTime = of.plusYears(1); System.out.println(localDateTime); //加2个月 LocalDateTime dateTime = of.plusMonths(2); System.out.println(dateTime); //减两个月 LocalDateTime localDateTime1 = of.plusMonths(-2); System.out.println("减两个月"+localDateTime1); System.out.println("年:"+ldt.getYear()+",月:"+ldt.getMonthValue()+ ",日:"+ldt.getDayOfMonth()+",时:"+ldt.getHour()+ ",分钟:"+ldt.getMinute()+",秒:"+ldt.getSecond());

6.3 Instant 时间戳
用于“时间戳”的运算。它是以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算
//默认使用 UTC 时区 Instant ins = Instant.now(); System.out.println(ins); OffsetDateTime odt = ins.atOffset(ZoneOffset.ofHours(8)); System.out.println(odt); System.out.println(ins.getNano()); Instant instant = Instant.ofEpochSecond(6); System.out.println(instant);

6.4 Duration 和 Period
  • Duration:用于计算两个“时间”间隔
  • Period:用于计算两个“日期”间隔
/** *//Duration : 用于计算两个“时间”间隔 *//Period : 用于计算两个“日期”间隔 */ @Test public void test03() { Instant now = Instant.now(); System.out.println("------------"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); }Instant now1 = Instant.now(); Duration between1 = Duration.between(now, now1); System.out.println("所消耗的时间:"+ between1.toMillis()); System.out.println("--------------"); LocalDate now2 = LocalDate.now(); LocalDate localDate = LocalDate.of(2011, 11, 1); Period between = Period.between(localDate, now2); System.out.println(between.getYears()); System.out.println(between.getMonths()); System.out.println(between.getDays()); }

6.5 日期的操纵
  • TemporalAdjuster : 时间校正器。有时我们可能需要获
    取例如:将日期调整到“下个周日”等操作。
  • TemporalAdjusters : 该类通过静态方法提供了大量的常
    用 TemporalAdjuster 的实现。
    例如获取下个周日

    jdk|jdk 8 特性 - 新时间日期,其他
    文章图片
    TemporalAdjuster 实现
/** * 4.TemporalAdjuster : 时间校正器 */ @Test public void test4() { LocalDateTime now = LocalDateTime.now(); System.out.println(now); LocalDateTime time = now.withDayOfMonth(10); System.out.println(time); //下一个周日 LocalDateTime with = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); System.out.println(with); //下一个工作日 System.out.println(now.with((l) -> { LocalDateTime l1 = (LocalDateTime) l; DayOfWeek dayOfWeek = l1.getDayOfWeek(); System.out.println(dayOfWeek.getValue()); if (dayOfWeek.equals(DayOfWeek.FRIDAY)) { return l1.plusDays(3); } else if (dayOfWeek.equals(DayOfWeek.SATURDAY)) { return l1.plusDays(2); } else { return l1.plusDays(1); } })); }

6.6 解析与格式化 java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
  • 预定义的标准格式
  • 语言环境相关的格式
  • 自定义的格式
/** * 5. DateTimeFormatter : 解析和格式化日期或时间 */ @Test public voidtest5() { DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE; //DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); LocalDateTime ldt = LocalDateTime.now(); String strDate = ldt.format(dtf); System.out.println(strDate); try { LocalDateTime parse = LocalDateTime.parse(strDate, dtf); System.out.println(parse); } catch (Exception e) { System.out.println(LocalDate.parse(strDate, dtf)); } }

6.7 时区 的处理
Java8 中加入了对时区的支持,带时区的时间为分别为:
ZonedDate、ZonedTime、ZonedDateTime

其中每个时区都对应着 ID,地区ID都为 “{区域}/{城市}”的格式
例如 :Asia/Shanghai 等
ZoneId:该类中包含了所有的时区信息
getAvailableZoneIds() : 可以获取所有时区时区信息
**of(id) **: 用指定的时区信息获取 ZoneId 对象
与传统日期处理的转换 jdk|jdk 8 特性 - 新时间日期,其他
文章图片
转换
/** * 6.ZonedDate、ZonedTime、ZonedDateTime : 带时区的时间或日期 */ @Test public void test7() { System.out.println( LocalDateTime.now(ZoneId.of("Asia/Shanghai")) ); System.out.println( LocalDateTime.now(ZoneId.of("US/Pacific")) ); }

7. 其他新特性 7.1 Optional 类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,
原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
7.2 重复注解与类型注解 【jdk|jdk 8 特性 - 新时间日期,其他】Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。

jdk|jdk 8 特性 - 新时间日期,其他
文章图片
image.png jdk|jdk 8 特性 - 新时间日期,其他
文章图片
image.png jdk|jdk 8 特性 - 新时间日期,其他
文章图片
image.png

    推荐阅读