JAVA中计算两个日期时间的差值竟然也有这么多门道( 二 )


getNano
获取当前Duration对应的纳秒数“零头” 。注意这里与toNanos()不一样,toNanos是Duration值的纳秒单位总长度,getNano()只是获取不满1s剩余的那个零头,以纳秒表示 。
isNegative
检查Duration实例是否小于0,若小于0返回true, 若大于等于0返回false
isZero
用于判断当前的时间间隔值是否为0,比如比较两个时间是否一致,可以通过between计算出Duration值,然后通过isZero判断是否没有差值 。
withSeconds
对现有的Duration对象的nanos零头值不变的情况下,变更seconds部分的值,然后返回一个新的Duration对象
withNanos
对现有的Duration对象的seconds值不变的情况下,变更nanos部分的值,然后返回一个新的Duration对象
关于Duration的主要API的使用,参见如下示意:
public void testDuration() {LocalTime target = LocalTime.parse("00:02:35.700");// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期// LocalDate today = LocalDate.now();LocalTime today = LocalTime.parse("12:12:25.600");// 输出:12:12:25.600System.out.println(today);// 输出:00:02:35.700System.out.println(target);Duration duration = Duration.between(target, today);// 输出:PT12H9M49.9SSystem.out.println(duration);// 输出:43789System.out.println(duration.getSeconds());// 输出:900000000System.out.println(duration.getNano());// 输出:729System.out.println(duration.toMinutes());// 输出:PT42H9M49.9SSystem.out.println(duration.plusHours(30L));// 输出:PT15.9SSystem.out.println(duration.withSeconds(15L));}

JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
  • Period
Period相关接口与Duration类似,其计数的最小单位是天,看下Period内部时间段记录采用了年、月、日三个field来记录:
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
常用的API方法列举如下:
方法
描述
between
计算两个日期之间的时间间隔 。注意,这里只能计算出相差几年几个月几天 。
ofXxx
of()或者以of开头的一系列static方法,用于基于传入的参数构造出一个新的Period对象
withXxx
以with开头的方法,比如withYears、withMonths、withDays等方法,用于对现有的Period对象中对应的年、月、日等字段值进行修改(只修改对应的字段,比如withYears方法,只修改year,保留month和day不变),并生成一个新的Period对象
getXxx
读取Period中对应的year、month、day字段的值 。注意下,这里是仅get其中的一个字段值,而非整改Period的不同单位维度的总值 。
plusXxx
对指定的字段进行追加数值操作
minusXxx
对指定的字段进行扣减数值操作
isNegative
检查Period实例是否小于0,若小于0返回true, 若大于等于0返回false
isZero
用于判断当前的时间间隔值是否为0,比如比较两个时间是否一致,可以通过between计算出Period值,然后通过isZero判断是否没有差值 。
关于Period的主要API的使用,参见如下示意:
public void calculateDurationDays() {LocalDate target = LocalDate.parse("2021-07-11");// 获取当前日期,此处为了保证后续结果固定,注掉自动获取当前日期,指定固定日期// LocalDate today = LocalDate.now();LocalDate today = LocalDate.parse("2022-07-08");// 输出:2022-07-08System.out.println(today);// 输出:2021-07-11System.out.println(target);Period period = Period.between(target, today);// 输出:P11M27D,表示11个月27天System.out.println(period);// 输出:0,因为period值为11月27天,即year字段为0System.out.println(period.getYears());// 输出:11,因为period值为11月27天,即month字段为11System.out.println(period.getMonths());// 输出:27,因为period值为11月27天,即days字段为27System.out.println(period.getDays());// 输出:P14M27D,因为period为11月27天,加上3月,变成14月27天System.out.println(period.plusMonths(3L));// 输出:P11M15D,因为period为11月27天,仅将days值设置为15,则变为11月15天System.out.println(period.withDays(15));// 输出:P2Y3M44DSystem.out.println(Period.of(2, 3, 44));}
JAVA中计算两个日期时间的差值竟然也有这么多门道

文章插图
 
Duration与Period踩坑记Duration与Period都是用于日期之间的计算操作 。Duration主要用于秒、纳秒等维度的数据处理与计算 。Period主要用于计算年、月、日等维度的数据处理与计算 。
先看个例子,计算两个日期相差的天数,使用Duration的时候:


推荐阅读