在Java编程中,处理时间间隔是一项常见任务。Java 8引入了Duration类,提供了方便的方法来处理和计算时间间隔。本文将介绍Duration类的定义、常见用法以及与其他时间类的比较。
与其他时间类的比较
-
与Instant类的比较: Duration类可以与Instant类一起使用,计算两个时间点之间的时间间隔。
-
与Period类的比较:
-
Duration类用于处理较小的时间间隔,例如天、小时、分钟、秒、毫秒、纳秒;而Period类用于处理较大的时间间隔,例如年、月、日。
-
Period类提供了一些方法来获取时间段中的年、月、日等信息,而Duration类则提供了更多的方法来进行时间计算和操作。
-
在实际使用过程中,Duration类和Period类都可以用于表示天的时间段,其他的不行,会抛出异常。
-
Duration duration = (1); Period period = (1);
-
Duration概述
Duration类是Java 8中引入的一个时间类,用于表示时间间隔的持续时间。它以纳秒为基本单位,可以处理从纳秒到天的范围。
创建Duration对象
ofXxx方法
-
(long amount, TemporalUnit unit)
: 用于创建表示特定时间单位的持续时间对象。该方法接受两个参数:amount
:表示持续时间的长整型数值。unit
:表示时间单位的 TemporalUnit 枚举类型或其子类。 -
(long days)
: 用于创建一个表示给定天数的Duration对象。 -
(long hours)
: 用于创建一个表示给定小时数的Duration对象。 -
(long minutes)
: 用于创建一个表示给定分钟数的Duration对象。 -
(long seconds)
: 用于创建一个表示给定秒数的Duration对象。 -
(long millis)
: 用于创建一个表示给定毫秒数的Duration对象。 -
(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方法
(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()
方法,此方法返回在给定单位中的持续时间。它接受一个参数,并返回该单位的数量。
-
比较两个Duration对象: 可以使用
compareTo()
方法比较两个Duration对象的大小。 -
增加或减少时间间隔:可以使用
plusXxx()
和minusXxx()
方法对Duration对象进行增加或减少时间间隔的操作,如plusHours()
、minusDays()
等。 -
判断是否为负时间间隔: 可以使用
isNegative()
方法判断Duration对象是否表示负时间间隔。
Duration#get(…)
-
Duration#get(...)
: 此方法返回在给定单位中的持续时间。它接受一个 参数,并返回该单位的数量。例如,如果你使用 -
Duration#getUnits()
: 此方法返回此持续时间包含的单位数。 -
Duration#getSeconds(...)
: 此方法返回此持续时间中的秒数部分。需要注意的是,这与get()
方法略有不同,后者将考虑任何溢出到分钟、小时或天数的秒数。 -
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编程中更加高效地操作时间。