简介

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

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

Duration

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

先来看看Duration的定义:

public final class Duration
implements 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 - 60
INFO com.flydean.time - 120000000
INFO 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 Period
implements 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. Pipelines - .NET中的新IO API指引(三) 边看边记

    Pipelines - .NET中的新IO API指引 作者 marcgravell  原文 此系列前两篇网上已有的译文 Pipelines - .NET中的新IO API指引(一) Pipeline ...

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

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

  3. JDK8 新增的日期时间API

    背景 JDK8中增加了一套全新的日期时间API,这里进行总结下,方便查询使用. 新的时间及日期API位于 java.time 包中,下面是一些关键类. Instant:代表的是时间戳. LocalDa ...

  4. 都9012了,Java8中的日期时间API你还没有掌握?

    一,Java8日期时间API产生的前因后果 1.1 为什么要重新定义一套日期时间API 操作不方便:java中最初的Date不能直接对指定字段进行加减操作也不支持国际化,后来新增了Calendar,但 ...

  5. java.util.Date和jdk1.8新时间API比拼

    旧的时间和日期的API的缺陷 Java 的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,而且都不是线程安全的. Date如果不格式化,打印出的日期可 ...

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

    https://zhuanlan.zhihu.com/p/39223648 原文:Pipelines - a guided tour of the new IO API in .NET, part 1 ...

  7. JDK8中的新特性

    1.lambda表达式 1.定义 Java 8 发布的最重要新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),可以推导出来的就可以省略了,Lambda 表达式免去了使用匿 ...

  8. java_JDK8中新增的时间API

    java.time 包含值对象的基础包 java.time.chrono 提供对不同的日历系统的访问 java.time.format 格式化和解析时间的日期 java.time.temporal 包 ...

  9. jdk8中CompletableFuture的各个API用法,极大扩展了Future

    就不介绍了,直接贴代码,建议在代码中使用,真的很方便 package cn.hou.completablefuture; import org.junit.Test; import java.util ...

随机推荐

  1. 日志分析平台ELK之日志收集器logstash常用插件配置

    前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...

  2. 【Python】类

    初探类 类定义与函数定义( def语句 )一样必须被执行才会起作用 调用 x.f() 其实就相当于 MyClass.f(x) 补充说明 数据属性会覆盖掉具有相同名称的方法属性 命名方法 方法名称使用大 ...

  3. CF877E Danil and a Part-time Job

    题目大意: link 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 pow 将一个点 x 的子树 ...

  4. Jmeter之连接数据库

    1.下载mysql驱动文件 2.移动到Jmeter目录下的lib中 3.在配置文件中使用 jdbc:mysql://127.0.0.1:3306/fns_test_bak?useUnicode=tru ...

  5. Hello World背后的事情

    Hello World是不少人学习C++的第一项内容,代码看似简单,很多东西却涉及根本 #include <iostream> using namespace std; int main( ...

  6. thinkphp5 chunk 分块处理数据小坑

    场景: 使用chunk方法进行分块查询写入数据,执行发现chunk分几条一次处理 数据库就插入几条,并没有return false; 代码如下 解决方法: 增加排序字段

  7. idea如何新建一个springmvc 工程

    java 版本 1.8.0_261 idea 版本2020.1 Tomcat 9  maven 3.6 新建工程 File->new->project 默认会下载springframewo ...

  8. yii2框架路径相关

    调用YII框架中jquery:Yii::app()->clientScript->registerCoreScript('jquery'); framework/web/js/source ...

  9. spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)

    一,为什么要使用async异步线程池? 1,在生产环境中,有一些需要延时处理的业务场景: 例如:发送电子邮件, 给手机发短信验证码 大数据量的查询统计 远程抓取数据等 这些场景占用时间较长,而用户又没 ...

  10. centos8平台使用slabtop监控slab内存的状态

    一,slabtop 所属的包: [root@yjweb ~]# whereis slabtop slabtop: /usr/bin/slabtop /usr/share/man/man1/slabto ...