文章目录

  • 简介
  • Duration
  • Period
  • ChronoUnit

简介

在JDK8中,引入了三个非常有用的时间相关的API:Duration,Period和ChronoUnit。

他们都是用来对时间进行统计的,本文将会详细讲解一下这三个API的使用。

Duration

Duration主要用来衡量秒级和纳秒级的时间,使用于时间精度要求比较高的情况。

先来看看Duration的定义:

public final class Durationimplements TemporalAmount, Comparable<Duration>, Serializable

可以看到,Duration是一个final class,并且它是可序列化和可比较的。我们注意,Duration还实现了TemporalAmount接口。

那么TemporalAmount接口是什么呢?

TemporalAmount是Duration和Period的父接口。

它定义了4个必须要实现的方法:

long get(TemporalUnit unit);
List<TemporalUnit> getUnits();
Temporal addTo(Temporal temporal);
Temporal subtractFrom(Temporal temporal);

其中TemporalUnit代表的是时间对象的单位,比如:years, months, days, hours, minutes 和 seconds.
而Temporal代表的是对时间对象的读写操作。

我们看下Duration的一些基本操作:

        Instant start = Instant.parse("2020-08-03T10:15:30.00Z");Instant end = Instant.parse("2020-08-03T10:16:30.12Z");Duration duration = Duration.between(start, end);log.info("{}",duration.getSeconds());log.info("{}",duration.getNano());log.info("{}",duration.getUnits());

上面我们创建了两个Instant,然后使用Duration.between方法来测算他们之间的差异。

其中秒部分的差异,使用duration.getSeconds()来获取,而秒以下精度部分的差异,我们使用duration.getNano()来获取。

最后我们使用duration.getUnits()来看一下duration支持的TemporalUnit(时间单位)。

看下执行结果:

 INFO com.flydean.time - 60INFO com.flydean.time - 120000000INFO com.flydean.time - [Seconds, Nanos]

除了Instance,我们还可以使用LocalTime:

        LocalTime start2 = LocalTime.of(1, 20, 25, 1314);LocalTime end2 = LocalTime.of(3, 22, 27, 1516);Duration.between(start2, end2).getSeconds();

我们还可以对Duration做plus和minus操作,并且通过使用isNegative来判断两个时间的先后顺序:

duration.plusSeconds(60);
duration.minus(30, ChronoUnit.SECONDS);
log.info("{}",duration.isNegative());

除此之外,我们方便的使用Duration.of方法来方便的创建Duration:

Duration fromDays = Duration.ofDays(1);
Duration fromMinutes = Duration.ofMinutes(60);

Period

Period的单位是year, month 和day 。

操作基本上和Duration是一致的。

先看下定义:

public final class Periodimplements ChronoPeriod, Serializable

其中ChronoPeriod是TemporalAmount的子接口。

同样的,我们可以使用Period.between从LocalDate来构建Period:

        LocalDate startDate = LocalDate.of(2020, 2, 20);LocalDate endDate = LocalDate.of(2021, 1, 15);Period period = Period.between(startDate, endDate);log.info("{}",period.getDays());log.info("{}",period.getMonths());log.info("{}",period.getYears());

也可以直接从Period.of来构建:

Period fromUnits = Period.of(3, 10, 10);Period fromDays = Period.ofDays(50);Period fromMonths = Period.ofMonths(5);Period fromYears = Period.ofYears(10);Period fromWeeks = Period.ofWeeks(40);

最后我们还可以使用plus或者minus的操作:

period.plusDays(50);
period.minusMonths(2);

ChronoUnit

ChronoUnit是用来表示时间单位的,但是也提供了一些非常有用的between方法来计算两个时间的差值:

        LocalDate startDate = LocalDate.of(2020, 2, 20);LocalDate endDate = LocalDate.of(2021, 1, 15);long years = ChronoUnit.YEARS.between(startDate, endDate);long months = ChronoUnit.MONTHS.between(startDate, endDate);long weeks = ChronoUnit.WEEKS.between(startDate, endDate);long days = ChronoUnit.DAYS.between(startDate, endDate);long hours = ChronoUnit.HOURS.between(startDate, endDate);long minutes = ChronoUnit.MINUTES.between(startDate, endDate);long seconds = ChronoUnit.SECONDS.between(startDate, endDate);long milis = ChronoUnit.MILLIS.between(startDate, endDate);long nano = ChronoUnit.NANOS.between(startDate, endDate);

本文的例子: learn-java-base-9-to-20

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/duration-period-chronounit/

本文来源:flydean的博客

欢迎关注我的公众号:「程序那些事」最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

JDK8中的新时间API:Duration Period和ChronoUnit介绍相关推荐

  1. 快速了解JDK8中的新日期时间类

    积土成山,风雨兴焉:积水成渊,蛟龙生焉:积善成德,而神明自得,圣心备焉.故不积跬步,无以至千里,不积小流无以成江海.齐骥一跃,不能十步,驽马十驾,功不在舍.面对悬崖峭壁,一百年也看不出一条裂缝来,但用 ...

  2. Pipelines - .NET中的新IO API指引(二)

    原文:Pipelines - a guided tour of the new IO API in .NET, part 2 作者:marcgravell 在上一章,我们讨论了以往的StreamAPI ...

  3. JDK8中的新特性——函数式接口

    JDK8 简介 概述 Java 8由Oracle从2014年3月18日发布,此版本是自Java 5(发布于2004年)之后的一个重量级版本,也是java发展史上的一个里程碑式的版本.这个版本在JVM. ...

  4. Java8新特性之新时间API

    Java8新特性之新时间API 一.新时间API 1.1 之前时间API存在问题:线程安全问题.设计混乱 1.2 本地化日期时间API:LoaclDate.LocalTime.LocalDateTim ...

  5. 【Java8新特性】关于Java8中的日期时间API,你需要掌握这些!!

    写在前面 Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志 ...

  6. 静态方法:关于Java8中的日期时间API,你需要掌握这些!!

    Java8之前的日期和时间API,存在一些问题,比如:线程安全的问题,跨年的问题等等.这些问题都在Hava8中的日期和时间API中得到了解决,而且Java8中的日期和时间API更加强大.立志成为架构师 ...

  7. Pipelines - .NET中的新IO API指引(一)

    原文:https://blog.marcgravell.com/2018/07/pipe-dreams-part-1.html 作者:marcgravell 大约两年前,我发表了一篇关于.NET中即将 ...

  8. 【JAVA8】新时间API操作大全

    文章目录 (1)LocalDate 操作日期值(仅包含年 月 日)信息 (2)LocalDateTime 操作时间值(详细的时间 包含年月日时分秒) (3)Duration 求时间差(基于时间值Loc ...

  9. JDK8后的日期时间API

    @Testpublic void test() { // now() 获取当前的时间,日期LocalDate ld = LocalDate.now();LocalTime lt = LocalTime ...

最新文章

  1. 机器学习_周志华_问题汇总_第1周
  2. 用什么tricks能让模型训练得更快?先了解下这个问题的第一性原理
  3. 字符串(string类)
  4. Codeforces Round #370 (Div. 2) A. Memory and Crow 水题
  5. python读文件每一行、并把这行替换-python基础--文件操作实现全文或单行替换
  6. 指针冒泡排序c语言代码,用指针编写冒泡排序方法
  7. python分箱统计个数_【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义...
  8. android 百分数与进度显示
  9. Apollo进阶课程㉗丨Apollo控制技术详解——控制理论
  10. java excel odbc_Java:无法使用JDBC ODBC更新Excel
  11. 正则提取Swagger在线文档里面的返回实体类字段
  12. Spring Boot 项目总是创建失败,这几个备选方案一定要收藏
  13. 从小小题目逐步走进 JavaScript 异步调用
  14. STM32 IIC实验中关于AT24Cxx的读写
  15. github电脑壁纸_有什么好用的电脑壁纸软件?
  16. 远程连接腾讯云MySQL数据库
  17. STM32的空闲中断
  18. 【GIS小白学习笔记】Excel加至Arcgis坐标分带选择
  19. GPU的发展史,GPU与CPU的关系是什么?为何现在GPU越来越重要?
  20. window下Anaconda环境的创建、删除、激活、退出

热门文章

  1. 数据挖掘竞赛-北京PM2.5浓度回归分析训练赛
  2. 逆向工程核心原理学习笔记(十四):栈帧1
  3. [WinSock]封装WSAAsyncSelect!
  4. cocos2d-x游戏实例(15)-纵版射击游戏(2)
  5. 手把手教你玩转SOCKET模型:完成例程(Completion Routine)篇
  6. live555 源码分析:简介
  7. 懒人chromium net android移植指南
  8. 什么是缓存?为什么要使用Redis?
  9. Python 日志模块Loguru的使用
  10. 使用VMware VSphere WebService SDK进行开发 (五)——根据虚拟机的名称获取对应主机的IP地址