Java的Duration类:掌握时间间隔的魔法

在Java编程中,处理时间间隔是一项常见任务。Java 8引入了Duration类,提供了方便的方法来处理和计算时间间隔。本文将介绍Duration类的定义、常见用法以及与其他时间类的比较。

与其他时间类的比较

  • 与Instant类的比较: Duration类可以与Instant类一起使用,计算两个时间点之间的时间间隔。

  • 与Period类的比较:

    • Duration类用于处理较小的时间间隔,例如天、小时、分钟、秒、毫秒、纳秒;而Period类用于处理较大的时间间隔,例如年、月、日。

    • Period类提供了一些方法来获取时间段中的年、月、日等信息,而Duration类则提供了更多的方法来进行时间计算和操作。

    • 在实际使用过程中,Duration类和Period类都可以用于表示天的时间段,其他的不行,会抛出异常。

    • Duration duration = Duration.ofDays(1); Period period = Period.ofDays(1);

Duration概述

Duration类是Java 8中引入的一个时间类,用于表示时间间隔的持续时间。它以纳秒为基本单位,可以处理从纳秒到天的范围。

创建Duration对象

ofXxx方法

  • Duration.of(long amount, TemporalUnit unit) : 用于创建表示特定时间单位的持续时间对象。该方法接受两个参数:amount:表示持续时间的长整型数值。unit:表示时间单位的 TemporalUnit 枚举类型或其子类。

  • Duration.ofDays(long days): 用于创建一个表示给定天数的Duration对象。

  • Duration.ofHours(long hours): 用于创建一个表示给定小时数的Duration对象。

  • Duration.ofMinutes(long minutes): 用于创建一个表示给定分钟数的Duration对象。

  • Duration.ofSeconds(long seconds): 用于创建一个表示给定秒数的Duration对象。

  • Duration.ofMillis(long millis): 用于创建一个表示给定毫秒数的Duration对象。

  • Duration.ofNanos(long nanos): 用于创建一个表示给定纳秒数的Duration对象。

  		Duration duration = Duration.of(1, ChronoUnit.DAYS);
      duration = Duration.ofDays(1);
      duration = Duration.ofHours(24);
      duration = Duration.ofMinutes(60);
      duration = Duration.ofSeconds(60);
      duration = Duration.ofMillis(1000);
      LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 13, 1, 1);
      LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间加上指定时间段后的日期时间
      System.out.println(plus);//输出结果:2023-01-01T13:01:02

between方法

Duration.between(LocalDateTime start, LocalDateTime end)用于计算两个 LocalDateTime 对象之间的持续时间。该方法接受两个参数:start:表示起始时间的 LocalDateTime 对象;end:表示结束时间的 LocalDateTime 对象。返回值是Duration对象;

	LocalDateTime localDateTime1 = LocalDateTime.of(2023, 1, 1, 13, 1, 1);
    LocalDateTime localDateTime2 = LocalDateTime.of(2023, 1, 1, 15, 1, 1);
    Duration duration = Duration.between(localDateTime1, localDateTime2);
    long seconds = duration.getSeconds();
    System.out.println(seconds);//输出结果:7200

常见操作和方法

  • 获取时间间隔的值: 可以使用toXxx()方法获取时间间隔的不同时间单位的值,如toNanos()toMillis()toMinutes()等。也可以用get()方法,此方法返回在给定单位中的持续时间。它接受一个java.time.temporal.TemporalUnit参数,并返回该单位的数量。
  • 比较两个Duration对象: 可以使用compareTo()方法比较两个Duration对象的大小。
  • 增加或减少时间间隔:可以使用plusXxx()minusXxx()方法对Duration对象进行增加或减少时间间隔的操作,如plusHours()minusDays()等。
  • 判断是否为负时间间隔: 可以使用isNegative()方法判断Duration对象是否表示负时间间隔。

Duration#get(…)

  • Duration#get(...): 此方法返回在给定单位中的持续时间。它接受一个 java.time.temporal.TemporalUnit 参数,并返回该单位的数量。例如,如果你使用 java.time.temporal.ChronoUnit.SECONDS,此方法将返回持续时间中的秒数。
  • Duration#getUnits(): 此方法返回此持续时间包含的单位数。
  • Duration#getSeconds(...): 此方法返回此持续时间中的秒数部分。需要注意的是,这与 get(java.time.temporal.ChronoUnit.SECONDS)方法略有不同,后者将考虑任何溢出到分钟、小时或天数的秒数。
  • Duration#getNano(...): 此方法返回此持续时间中的纳秒数部分。与秒一样,这不会考虑任何溢出到更高单位的纳秒数。
	Duration duration = Duration.ofHours(2);
    List<TemporalUnit> units = duration.getUnits();
    System.out.println(units.toString());//输出结果:[Seconds, Nanos]
    long seconds = duration.get(ChronoUnit.SECONDS);
    System.out.println(seconds);//输出结果:7200
    long seconds1 = duration.getSeconds();
    System.out.println(seconds1);//输出结果:7200
    duration = Duration.ofNanos(10000);
    int nano = duration.getNano();
    System.out.println(nano);//输出结果:10000

Duration#plus(…)

  • Duration#plus(...): 将当前Duration对象与另一个Duration对象相加,返回一个新的Duration对象,表示两个时间段的总和。
  • Duration#plusDays(...): 将当前Duration对象与指定的天数相加,返回一个新的Duration对象,表示增加天数后的时间段。
  • Duration#plusHours(...): 将当前Duration对象与指定的小时数相加,返回一个新的Duration对象,表示增加小时数后的时间段。
  • Duration#plusMinutes(...): 将当前Duration对象与指定的分钟数相加,返回一个新的Duration对象,表示增加分钟数后的时间段。
  • Duration#plusSeconds(...): 将当前Duration对象与指定的秒数相加,返回一个新的Duration对象,表示增加秒数后的时间段。
  • Duration#plusMillis(...): 将当前Duration对象与指定的毫秒数相加,返回一个新的Duration对象,表示增加毫秒数后的时间段。
  • Duration#plusNanos(...): 将当前Duration对象与指定的纳秒数相加,返回一个新的Duration对象,表示增加纳秒数后的时间段。
	LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 15, 1, 1);
    Duration duration = Duration.ofHours(2);//定义一个2小时的时间段
    duration=duration.plus(60,ChronoUnit.MINUTES);//当前时间段加上60分钟
    duration=duration.plusDays(1);//当前时间段加上1天
    duration=duration.plusHours(1);//当前时间段加上1小时
    duration=duration.plusMinutes(60);//当前时间段加上60分钟
    duration=duration.plusSeconds(60);//当前时间段加上60秒
    LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间,加上当前的时间段后的日期时间
    System.out.println(plus);//输出结果:2023-01-02T20:02:01

Duration#minus(…)

  • Duration#minus(...): 从一个Duration对象中减去另一个Duration对象。它返回一个新的Duration对象,表示当前Duration对象与减去的那一个之间的差值。
  • Duration#minusDays(...): 从一个Duration对象中减去指定数量的天数。它返回一个新的Duration对象,表示当前Duration对象减去指定天数后的结果。
  • Duration#minusHours(...): 从一个Duration对象中减去指定数量的小时数。它返回一个新的Duration对象,表示当前Duration对象减去指定小时数后的结果。
  • Duration#minusMinutes(...): 从一个Duration对象中减去指定数量的分钟数。它返回一个新的Duration对象,表示当前Duration对象减去指定分钟数后的结果。
  • Duration#minusSeconds(...): 从一个Duration对象中减去指定数量的秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定秒数后的结果。
  • Duration#minusMillis(...): 从一个Duration对象中减去指定数量的毫秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定毫秒数后的结果。
  • Duration#minusNanos(...): 从一个Duration对象中减去指定数量的纳秒数。它返回一个新的Duration对象,表示当前Duration对象减去指定纳秒数后的结果。
	LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 10, 15, 1, 1);
    Duration duration = Duration.ofHours(2);//定义一个2小时的时间段
    duration = duration.minus(60, ChronoUnit.MINUTES);//当前时间段减去60分钟
    duration = duration.minusDays(1);//当前时间段减去1天
    duration = duration.minusHours(1);//当前时间段减去1小时
    duration = duration.minusMinutes(60);//当前时间段减去60分钟
    duration = duration.minusSeconds(60);//当前时间段减去60秒
    LocalDateTime minus = localDateTime.minus(duration);//计算当前日期时间,减去当前的时间段后的日期时间
    System.out.println(minus);//输出结果:2023-01-11T16:02:01

Duration#toXxx()

  • Duration#toDays(): 将Duration对象转换为天数。它返回一个整数值,表示时间段中包含的天数。
  • Duration#toHours(): 将Duration对象转换为小时数。它返回一个整数值,表示时间段中包含的小时数。
  • Duration#toMinutes(): 将Duration对象转换为分钟数。它返回一个整数值,表示时间段中包含的分钟数。
  • Duration#toSeconds(): 将Duration对象转换为秒数。它返回一个整数值,表示时间段中包含的秒数。
  • Duration#toMillis(): 将Duration对象转换为毫秒数。它返回一个整数值,表示时间段中包含的毫秒数。
  • Duration#toNanos(): 将Duration对象转换为纳秒数。它返回一个整数值,表示时间段中包含的纳秒数。
    Duration duration = Duration.ofDays(1);//定义一个24小时的时间段
    long days = duration.toDays();//结果:1
    long hours = duration.toHours();//结果:24
    long minutes = duration.toMinutes();//结果:1440
    long seconds = duration.toSeconds();//结果:86400

示例代码

下面是一些示例代码,展示了Duration类的常见用法:

Duration duration = Duration.ofMinutes(30);
long minutes = duration.toMinutes(); // 获取时间间隔的分钟数
Duration halfDay = Duration.ofHours(12);
Duration updatedDuration = duration.plusMinutes(15); // 增加15分钟的时间间隔
boolean isNegative = duration.isNegative(); // 判断是否为负时间间隔

总结

Duration类是Java 8引入的用于处理时间间隔的类。它提供了方便的方法来创建、操作和计算时间间隔。与其他时间类相比,Duration类适用于较小的时间间隔处理。通过熟练掌握Duration类的用法,您可以更轻松地处理时间间隔,并在Java编程中更加高效地操作时间。

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值