深入了解Java Duration类,对时间的精细操作

2023-12-11 00:30

本文主要是介绍深入了解Java Duration类,对时间的精细操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

阅读建议

嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议:

  1. 本篇文章大概6000多字,预计阅读时间长需要5分钟。
  2. 本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章,建议收藏起来,方便时常学习与回顾,温故而知新。
  3. 创作不易,免费的点赞、关注,请走上一走,算是对博主一些鼓励,让我更有动力输出更多的干货内容。

注意

本文编写的单元测试是基于java11,具体的版本号是:11.0.19

Duration

Duration 是 Java 中表示时间段的类,用于计算两个时间点之间的间隔。它包含秒(seconds)和纳秒(nanos)两个部分,可以表示毫秒及更小的时间单位。与 Java 中的其他时间类不同,Duration 不包含毫秒这个属性。

@Test
public void test(){Duration duration=Duration.of(60, ChronoUnit.SECONDS);LocalDateTime localDateTime = LocalDateTime.of(2023, 1, 1, 13, 1, 1);LocalDateTime plus = localDateTime.plus(duration);//计算当前日期时间,加上指定时间段后的日期时间System.out.println(plus);//输出结果:2023-01-01T13:02:01
}

与Period类相比,Duration类和Period类都用于表示时间段,但它们在表示的时间单位和使用方式上有所不同。Period类主要用于表示年、月、日等较大的时间单位,而Duration类主要用于表示更小的时间单位,例如毫秒、纳秒等。此外,Period类提供了一些方法来获取时间段中的年、月、日等信息,而Duration类则提供了更多的方法来进行时间计算和操作。在实际使用过程中,Duration类和Period类都可以用于表示天的时间段,其他的不行,会抛出异常。

@Test
public void test2(){Duration duration=Duration.of(1,ChronoUnit.DAYS);Period period = Period.ofDays(1);System.out.println(period.getDays() == duration.toDays());
}

核心方法

Duration的核心方法包括:

Duration#of(...)

  • Duration#of(long duration):这个方法用于创建一个表示给定持续时间的Duration对象,单位为纳秒。持续时间可以是从零到Long.MAX_VALUE之间的任何值。
  • 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对象。
@Test
public void test2() {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
}

Duration#between(...)

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

@Test
public void test3() {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
}

Duration#get(...)

  • Duration#get(...): 此方法返回在给定单位中的持续时间。它接受一个 java.time.temporal.TemporalUnit 参数,并返回该单位的数量。例如,如果你使用 java.time.temporal.ChronoUnit.SECONDS,此方法将返回持续时间中的秒数。
  • Duration#getUnits(...): 此方法返回此持续时间包含的单位数。这通常与 get() 方法一起使用,以确定持续时间的长度,但不具体到秒或纳秒。例如,如果你有一个持续时间为2天、3小时、4分钟和5秒,那么 getUnits() 将返回一个包含这些单位的 long[] 数组。
  • Duration#getSeconds(...): 此方法返回此持续时间中的秒数部分。需要注意的是,这与 get(java.time.temporal.ChronoUnit.SECONDS) 方法略有不同,后者将考虑任何溢出到分钟、小时或天数的秒数。
  • Duration#getNano(...): 此方法返回此持续时间中的纳秒数部分。与秒一样,这不会考虑任何溢出到更高单位的纳秒数。
@Test
public void test4() {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);//输出结果:7200long seconds1 = duration.getSeconds();System.out.println(seconds1);//输出结果:7200duration = 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对象,表示增加纳秒数后的时间段。
@Test
public void test5() {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对象减去指定纳秒数后的结果。
@Test
public void test6() {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#toDays()

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

上一篇:深入了解Java Period类,对时间段的精确控制-CSDN博客

这篇关于深入了解Java Duration类,对时间的精细操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478828

相关文章

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息