最近发现spring boot中的有些配置使用了Duration,于是详细的看了Duration这个类

Duration是在Java8中加入的,主要是用来计算日期,差值之类的。

Duration被声明final(immutable),并且线程安全。

先看下Duration的实例化方式,由于构造器被私有了,对外只提供了一个ZERO实例,主要是使用静态工厂方法来进行实例化

自定义初始化方式,这种方式主要是以一系列of…()方法为主,可以自定义时分秒。

of(long amount, TemporalUnit unit) 在ZERO的基础上加上一定时间,第一个参数指定数量,第二个指定单位,单位可使用ChronoUnit(实现了TemporalUnit)

from(TemporalAmount amount) 通过TemporalAmount获取一个Duration实例,也是在ZERO的基础上增加

转换字符串方式,类似于SimpleDateFormat的格式化日期方式

Duration字符串类似数字有正负之分,默认正,负以’-‘开头,紧接着’P’,下面所有字母都不区分大小写:

‘D’ – 天

‘H’ – 小时

‘M’ – 分钟

‘S’ – 秒

字符’T’是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱,比如:P2DT3M5S,P3D,PT3S

PT3M2S 等于 -PT-3M-2S

通过日期获取,这种方式实现是 between(Temporal startInclusive, Temporal endExclusive) 方法,该方法获取两个时间段的Duration实例,Temporal有多种实现,其中就有jdk1.8中添加的LocalTime等等

下面介绍基本的公共方法,主要是对Duration做一些基本操作:

时间转换为时分秒:toSeconds(),to…()等方法

两个Duration比较:compareTo()相等返回0,大于返回正数,小于返回负数

获取指定单位的数值:get(TemporalUnit unit)

获取Duration中所有单位:getUnits()

获取Duration绝对值:abs()

给指定Temporal添加一个Duration:addTo(Temporal temporal)

getNano() 获取纳秒数,获取的是纳秒部分的值,而不是转换成纳秒

getSeconds() 获取秒数,获取的是秒部分的值,而不是转换成秒

plusSeconds(), plus…() 加法 增加时间(时分秒),返回新实例

dividedBy(long divisor) 除法,返回一个新的Duration实例,内部转换成秒来实现

multipliedBy(long multiplicand) 惩罚,返回一个新的Duration实例,内部同样也是转换成秒来实现

minus…()相关方法 减法:注意是用你输入参数去减,返回的是新的Duration实例

四则运算都是返回的新实例,并没有对旧实例进行修改,这是需要注意的,所以千万别忽略了返回值。

返回一个负的Duration实例:negated() 比如 PT1.4S 返回 PT-1.4S

isZero() 判断是否是 ZERO 实例

withSeconds() 和 withNanos() 两个方法通过传入秒数或者纳秒数来构造一个Duration副本

最后来看下Duration实现原理,其实很简单,Duration内部维护了 seconds 和 nanos 两个内部 long 型变量用来记录实际的Duration值,上面的所有操作其实基本都是对这两个内部变量的操作。

构造Duration实例中核心方法是:

private static Duration create(long seconds, int nanoAdjustment) {

if ((seconds | nanoAdjustment) == 0) {

return ZERO;

}

return new Duration(seconds, nanoAdjustment);

}

从这里也可以看出对Duration的实例化,其实就是对内部两个变量的一个赋值操作。

最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。

版权所有丨转载请注明出处:https://minei.me/archives/342.html

java 初始化duration_JAVA 8 DURATION 详解相关推荐

  1. java实现标准化考试系统详解(四)-----初始化操作实现

    (一)初始化操作实现 如上图所示当管理员需要更改适用工程.试题数量.考试时间时直接在文本中更改就好我们只需要每次在用户打开程序时初始化这些参数就可以 1.初始化试题模型,这里需要实现随机抽题,方法是用 ...

  2. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  3. 【Java基础】HashMap原理详解

    [Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...

  4. Java中的Runtime类详解

    Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...

  5. [java] 虚拟机(JVM)底层结构详解[转]

    [java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...

  6. 转:Java 7 种阻塞队列详解

    转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...

  7. 【Java SE】封装的详解

    篮球哥温馨提示:编程的同时不要忘记锻炼哦! 因为热爱,所以编程 目录 1.封装 1.1 什么是封装? 2.2 访问权限 2.3 private 简单使用 2.封装之包的概念 2.1 什么是包? 2.2 ...

  8. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  9. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

最新文章

  1. git clean和git reset结合用法
  2. Html_div圆角
  3. 如何运用深度强化学习,让机器人运动更灵活智能?
  4. hdu3037 Saving Beans
  5. c语言中的static变量和static函数
  6. 上海Oracle高峰会感悟
  7. 面试基础-- JDK、JRE、JVM
  8. python可视化水平双向箭头_python数据可视化第二弹
  9. Modbus协议栈应用实例之四:ModbusTCP服务器应用
  10. 解决jQgrid 设置列宽度自动调整时, 出现滚动条问题.
  11. 干货 | 我可以读哪些论文来跟上现代NLP的最新趋势?
  12. Mybatis安装配置使用
  13. php-cs-fixer不起作用,使用 PHP-CS-Fixer 规范PHP代码
  14. k3c最新官改非常稳定了_软件聚分享库APP最新版下载-软件聚分享库v1.0.0安卓版下载...
  15. 库存收藏-各种设备默认用户名和密码
  16. illegal instruction 解决办法
  17. 华为 荣耀 等手机解锁BootLoader
  18. 基于二维激光雷达的三维激光扫描系统的设计与实现
  19. FaceNet 读书笔记
  20. 宽依赖和窄依赖_Spark RDD的宽依赖和窄依赖

热门文章

  1. 杀死所有tomcat进程
  2. Eclipse添加注释的快捷键alt+shift+j,在菜单中是source-gt;generate element comment
  3. 中山电子科技大学计算机学院分数线,电子科技大学中山学院
  4. java写顾客购买的商品总价格_成交总金额=商品价格×商品件数-总优惠额。 如果一个顾客,购买的商品一口价为5元,购买的商品件数为4,总物流运费4元,满20送3,请问成交的金额是()。...
  5. java math mod_java8 Math新增方法介绍
  6. 队列CircularFifoQueue:offer与add的区别
  7. Oracle提示“ORA-04098:触发器‘XXX_TRIGGER’无效且未通过重新验证”
  8. redis允许其他机器远程连接
  9. Git如何忽略已经上传的文件或文件夹?
  10. 极速安装JumpServer - 官方文档版