浅谈JDK8中的Duration Period和ChronoUnit

目录
  • 一、Duration
  • 二、Period
  • 三、ChronoUnit

一、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);

以上就是浅谈JDK8中的Duration Period和ChronoUnit的详细内容,更多关于JDK8 Duration Period和ChronoUnit的资料请关注我们其它相关文章!

(0)

相关推荐

  • JDK8中的HashMap初始化和扩容机制详解

    一.HashMap初始化方法 HashMap() 不带参数,默认初始化大小为16,加载因子为0.75: HashMap(int initialCapacity) 指定初始化大小: HashMap(int initialCapacity, float loadFactor) 指定初始化大小和加载因子大小: HashMap(Map<? extends K,? extends V> m) 用现有的一个map来构造HashMap. 二.分析初始化过程 1.初始化代码测试用例 Map<String

  • 深入解析Jdk8中Stream流的使用让你脱离for循环

    学习要求: 知道一点儿函数式接口和Lambda表达式的基础知识,有利于更好的学习. 1.先体验一下Stream的好处 需求:给你一个ArrayList用来保存学生的成绩,让你打印出其中大于60的成绩. public static void main(String[] args) { ArrayList<Integer> arrList = new ArrayList<>(); for (int i = 0; i < 100; i++) { arrList.add((int)

  • 为什么JDK8中HashMap依然会死循环

    JDK8中HashMap依然会死循环! 是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题. 然而事实并非如此.少年可曾了解一种红黑树成环的场景,=v= 今日在查看监控时候发现,某一台机器load飙升 感觉问题不对劲,ssh大法登陆机器,top,top -Hp,jstack,jmap四连击保存下来堆栈,cpu使用最高的线程,内存信息准备分析. 首先查看使用最耗费cpu的线程堆栈信息 cat stack | g

  • JDK8中新增的Optional工具类基本使用

    Optional类的使用 JDK8以前,编写代码,通常会出现 NullPointerException (空指针异常),通常情况下我们都是通过 if ... else... 来对对象进行为空判断,然后再进行逻辑处理,代码写起来也比较冗余. JDK8新增了Optional类,使用该类可以避免我们对空指针的检查,使代码看起来比较优雅.   最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下Optional 这个Optional类注意是解决空指针的问题 1.

  • JDK8配置环境变量的bat文件的详细教程

    网上教程不少,有些好惨. 我的JDK在这里,只安装一次,后面直接压缩,这样就制成了解压版,解压配置环境变量即可用,妙. 打开看看 再打开 了解目录结构的目的,为了改bat文件,第三行! @echo off set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment set JAVA_HOME=E:\soft\jdk\jdk8\jdk1.8.0_152 echo. echo

  • JDK8并行流及串行流区别原理详解

    由于处理器核心的增长及较低的硬件成本允许低成本的集群系统,致使如今并行编程无处不在,并行编程似乎是下一个大事件. Java 8 针对这一事实提供了新的 stream API 及简化了创建并行集合和数组的代码.让我们看一下它是怎么工作的. 假设 myList 是 List<Integer> 类型的,其中包含 500,000 个Integer值.在Java 8 之前的时代中,对这些整数求和的方法是使用 for 循环完成的. for( int i : myList){ result += i; }

  • 浅谈JDK8中的Duration Period和ChronoUnit

    目录 一.Duration 二.Period 三.ChronoUnit 一.Duration Duration主要用来衡量秒级和纳秒级的时间,使用于时间精度要求比较高的情况. 先来看看Duration的定义: public final class Duration implements TemporalAmount, Comparable<Duration>, Serializable 可以看到,Duration是一个final class,并且它是可序列化和可比较的.我们注意,Duratio

  • 浅谈Java中几种常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用"=="来完成. 第二个方面:以对象的某一个属性的角度去比较. 从最新的JDK8而言,有三种实现对象比较的方法: 一.覆写Object类的equals()方法: 二.继承Comparable接口,并实现compareTo()方法: 三.定义一个单独的对象比较器,继承自Comparator接口

  • 浅谈java8中map的新方法--replace

    Map在Java8中新增了两个replace的方法 1.replace(k,v) 在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值) 在指定的键不存在时,方法会return回来一个null javadoc的注释解释了该默认值方法的实现的等价Java代码: if (map.containsKey(key)) { return map.put(key, value); } else { return null; } 下面展示的是新方法和JDK8之前的方法比较: /* *

  • 浅谈Angular中ngModel的$render

    在我开始着手ngModel的领域时候,有一个问题很令我纠结,那就是$render()到底是做什么的呢?查了很多资料都只是简单的描述一下,这就令我很纠结了,终于在一个阳光明媚的晚上,我终于解决了这个大问题 那么这个$render方法到底是干什么的呢?他的用处就是在$viewValue改变的时候可以重新绑定model数据,但是我们要注意一点($viewValue和DOM节点的value是不同的),我觉得他们的区别有点类似setTimeout和$timeout的区别,但是又不太一样.ps:其实mode

  • 浅谈Java中Unicode的编码和实现

    Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次. 编码方式 字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值."A"是一个字符,"€"也是一个字符.字符集是字符的集合.编码字符集是一个字符集,它为每一个字符分配一个唯一数字. Unicode 最初设计是作为一种固定宽度的 16 位字符编码.也就是每个字符占用2个字节.这样理论上一共最多可以表示216(即65536)个字符.上述16位统一码字符构成基

  • 浅谈python中copy和deepcopy中的区别

    在下是个编程爱好者,最近将魔爪伸向了Python编程.....遇到copy和deepcopy感到很困惑,现在针对这两个方法进行区分,一种是浅复制(copy),一种是深度复制(deepcopy). 首先说一下deepcopy,所谓的深度复制,在这里我理解的是完全复制然后变成一个新的对象,复制的对象和被复制的对象没有任何关系,彼此之间无论怎么改变都相互不影响. 然后说一下copy,在这里我分为两类来说,一种是字典数据类型的copy函数,一种是copy包的copy函数. 一.字典数据类型的copy函数

  • 浅谈python中列表、字符串、字典的常用操作

    列表操作如此下: a = ["haha","xixi","baba"] 增:a.append[gg] a.insert[1,gg] 在下标为1的地方,新增 gg 删:a.remove(haha) 删除列表中从左往右,第一个匹配到的 haha del a.[0] 删除下标为0 对应的值 a.pop(0) 括号里不写内容,默认删除最后一个,写了,就删除对应下标的内容 改:a.[0] = "gg" 查:a[0] a.index(&q

  • 浅谈PHP中的数据传输CURL

    确认是否安装了CURL扩展 Linux下命令: [root@fengniu020 ~]# php -i | grep -i curl Additional .ini files parsed => /etc/php.d/curl.ini, curl cURL support => enabled cURL Information => 7.19.7 curl操作步骤解析: CURL实例 1.一个简单的curl,抓取百度首页 2.下载一个网页并把内容中的"百度"替换为&

  • 浅谈django中的认证与登录

    认证登录 django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1  authenticate(**credentials)    提供了用户认证,即验证用户名以及密码是否正确 一般需要username  password两个关键字参数 如果认证信息有效,会返回一个  User  对象.authenticate()会在User 对象上设置一个属性标识那种认证后端认证了该用户,且该信息在后面的登录过程中是需要的.当我们试图登陆一个从数据库中直接取出来不经过authent

  • 浅谈Vim中的Tab与空格缩进

    vim缩进参数解析 缩进用 tab 制表符还是空格,个人爱好问题.但是在大多项目中,习惯使用空格.关于缩进,vim中可以通过如下四个参数进行配置 set tabstop=4 set softtabstop=4 set shiftwidth=4 set noexpandtab / expandtab1 解析: tabstop 表示按一个tab之后,显示出来的相当于几个空格,默认的是8个. softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度. shiftwidth 表示每一级缩

随机推荐