Java8中计算时间的四种方式及区别Period、Duration、ChronoUnit、Until 时间区间Duration的简单使用

一.简述

在Java8中,我们可以使用以下类来计算日期时间差异:

1.Period
2.Duration
3.ChronoUnit

二.Period类

Period类计算只有年、月、日

计算的是LocalDate两个时间间隔的年月日

public static void main(String[] args) {LocalDate startTime = LocalDate.now();System.err.println("startTime : " + startTime);LocalDate endTime = LocalDate.now().plusMonths(18);System.err.println("endTime : " + endTime);Period p = Period.between(startTime, endTime);System.err.printf("时间间隔 : %d 年 %d 月 %d 日", p.getYears(), p.getMonths(), p.getDays());}
运行结果:
startTime : 2022-05-12
endTime : 2023-11-12
时间间隔 : 160

三.Duration

Duration类计算只有日、时、分、秒、毫秒,

计算的是LocalDateTimel两个时间分别间隔的日、时、分、秒、毫秒

 public static void main(String[] args) {LocalDateTime startTime = LocalDateTime.now();System.err.println("startTime : " + startTime);LocalDateTime endTime = LocalDateTime.now().plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);System.err.println("endTime : " + endTime);Duration between = Duration.between(startTime, endTime);System.err.println("日 "+between.toDays());System.err.println("时 "+between.toHours());System.err.println("分 "+between.toMinutes());System.err.println("秒 "+between.getSeconds());System.err.println("毫秒"+between.toMillis());System.err.printf("时间间隔 : %d 日 %d 时 %d 分 %d 秒 %d 毫秒 ", between.toDays(), between.toHours(),between.toMinutes(),between.getSeconds(),between.toMillis());}
运行结果:
startTime : 2022-05-12T17:37:06.426
endTime : 2022-05-13T18:39:06.426125150290120
毫秒90120000
时间间隔 : 12515029012090120000 毫秒 

四.ChronoUnit类

ChronoUnit类计算有年、月、周、日、时、分、秒、毫秒

计算的是LocalDate和LocalDateTime两个时间分别间隔的年、月、周、日、时、分、秒、毫秒

public static void main(String[] args) {LocalDateTime startTime = LocalDateTime.now();System.err.println("startTime : " + startTime);LocalDateTime endTime = LocalDateTime.now().plusYears(1).plusMonths(1).plusWeeks(1).plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);System.err.println("endTime : " + endTime);long years = ChronoUnit.YEARS.between(startTime, endTime);System.err.println("日 "+years);long months = ChronoUnit.MONTHS.between(startTime,endTime);System.err.println("月 "+months);long weeks = ChronoUnit.WEEKS.between(startTime,endTime);System.err.println("周 "+weeks);long days = ChronoUnit.DAYS.between(startTime,endTime);System.err.println("日 "+days);long hours = ChronoUnit.HOURS.between(startTime,endTime);System.err.println("时 "+hours);long minutes = ChronoUnit.MINUTES.between(startTime,endTime);System.err.println("分 "+minutes);long seconds = ChronoUnit.SECONDS.between(startTime,endTime);System.err.println("秒 "+seconds);long millis = ChronoUnit.MILLIS.between(startTime,endTime);System.err.println("月 "+months);System.err.printf("时间间隔 : %d 年 %d 月 %d 周 %d 日 %d 时 %d 分 %d 秒 %d 毫秒 ", years,months,weeks,days,hours,minutes,seconds,millis);}
运行结果:
startTime : 2022-05-12T17:57:05.379
endTime : 2023-06-20T18:59:05.3801135740496975818223490932013
时间间隔 : 1135740496975818223490932034909320001 毫秒 

五.Until

until同**四.ChronoUnit类一样,**计算有年、月、周、日、时、分、秒、毫秒

计算的是LocalDate和LocalDateTime两个时间分别间隔的年、月、周、日、时、分、秒、毫秒

public static void main(String[] args) {LocalDateTime startTime = LocalDateTime.now();System.err.println("startTime : " + startTime);LocalDateTime endTime = LocalDateTime.now().plusYears(1).plusMonths(1).plusWeeks(1).plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);System.err.println("endTime : " + endTime);long years = startTime.until(endTime, ChronoUnit.YEARS);System.err.println("日 "+years);long months = startTime.until(endTime, ChronoUnit.MONTHS);System.err.println("月 "+months);long weeks = startTime.until(endTime, ChronoUnit.WEEKS);System.err.println("周 "+weeks);long days = startTime.until(endTime, ChronoUnit.DAYS);System.err.println("日 "+days);long hours = startTime.until(endTime, ChronoUnit.HOURS);System.err.println("时 "+hours);long minutes = startTime.until(endTime, ChronoUnit.MINUTES);System.err.println("分 "+minutes);long seconds = startTime.until(endTime, ChronoUnit.SECONDS);System.err.println("秒 "+seconds);long millis = startTime.until(endTime, ChronoUnit.MILLIS);System.err.println("月 "+months);System.err.printf("时间间隔 : %d 年 %d 月 %d 周 %d 日 %d 时 %d 分 %d 秒 %d 毫秒 ", years,months,weeks,days,hours,minutes,seconds,millis);}
运行结果:
startTime : 2022-05-12T18:01:45.622
endTime : 2023-06-20T19:03:45.6231135740496975818223490932013
时间间隔 : 1135740496975818223490932034909320001 毫秒 

六.计算LocalDateTime两个时间间隔的日、时、分、秒

   public static void main(String[] args) {LocalDateTime startTime = LocalDateTime.now();System.err.println("startTime : " + startTime);LocalDateTime endTime = LocalDateTime.now().plusYears(0).plusMonths(1).plusWeeks(1).plusDays(1).plusHours(1).plusMinutes(1).plusMinutes(1);System.err.println("endTime : " + endTime);long between = Duration.between(startTime, endTime).getSeconds();long days = between / 60 /60 / 24;System.err.println("日 "+days);long hours = between / 60 / 60 % 24;System.err.println("时 "+hours);long minutes = between / 60 % 60;System.err.println("分 "+minutes);long seconds = between % 60;System.err.println("秒 "+seconds);System.err.printf("时间间隔 : %d 日 %d 时 %d 分 %d 秒 %d 毫秒 ", days,hours,minutes,seconds);}
运行结果:
startTime : 2022-05-12T20:04:42.435
endTime : 2022-06-20T21:06:42.43539120
时间间隔 : 39120



创建时间区间Duration的一些方法

简单介绍一下时间区间类Duration的一些常用方法,方便计算时间区间和时间段的一些处理。
jdk1.8及更高版本可用。

1、between

传入两个时间计算时间区间
示例:

LocalDateTime start = LocalDateTime.of(2022,1,1,8,0,0);
LocalDateTime end = LocalDateTime.of(2022,1,2,8,30,30);
Duration duration = Duration.between(start, end);

2、parse(“PnDTnHnMn.nS”)

示例:

        Duration duration = Duration.parse("PnDTnHnMn.nS");

parse参数的格式PaDTbHcMd.eS:a天b小时c分钟d.e秒
源码例子:

        Examples:"PT20.345S" -- parses as "20.345 seconds""PT15M"     -- parses as "15 minutes" (where a minute is 60 seconds)"PT10H"     -- parses as "10 hours" (where an hour is 3600 seconds)"P2D"       -- parses as "2 days" (where a day is 24 hours or 86400 seconds)"P2DT3H4M"  -- parses as "2 days, 3 hours and 4 minutes""P-6H3M"    -- parses as "-6 hours and +3 minutes""-P6H3M"    -- parses as "-6 hours and -3 minutes""-P-6H+3M"  -- parses as "+6 hours and -3 minutes"

3、Duration.of(long amount, TemporalUnit unit)

示例:

        Duration duration = Duration.of(2, ChronoUnit.DAYS);

参数TemporalUnit unit详见ChronoUnit枚举类

    //纳秒NANOS("Nanos", Duration.ofNanos(1)),//微秒MICROS("Micros", Duration.ofNanos(1000)),//毫秒MILLIS("Millis", Duration.ofNanos(1000_000)),//秒SECONDS("Seconds", Duration.ofSeconds(1)),//分MINUTES("Minutes", Duration.ofSeconds(60)),//小时HOURS("Hours", Duration.ofSeconds(3600)),//半天HALF_DAYS("HalfDays", Duration.ofSeconds(43200)),//天DAYS("Days", Duration.ofSeconds(86400)),//周WEEKS("Weeks", Duration.ofSeconds(7 * 86400L)),//月MONTHS("Months", Duration.ofSeconds(31556952L / 12)),//年YEARS("Years", Duration.ofSeconds(31556952L)),//十年DECADES("Decades", Duration.ofSeconds(31556952L * 10L)),//世纪(百年)CENTURIES("Centuries", Duration.ofSeconds(31556952L * 100L)),//千年MILLENNIA("Millennia", Duration.ofSeconds(31556952L * 1000L)),//纪元(好多年)ERAS("Eras", Duration.ofSeconds(31556952L * 1000_000_000L)),FOREVER("Forever", Duration.ofSeconds(Long.MAX_VALUE, 999_999_999));

4、Duration.from

示例:

        Duration du1 = Duration.ofHours(10);Duration duration = Duration.from(du1);

5、Duration.ofDays(long days)

创建时间区间 Duration.ofDays(long days)
类似方法:ofDays、ofHours、ofMinutes、ofSeconds、ofMillis、ofNanos

		Duration duration = Duration.ofDays(2);

时间区间计算的一些方法

区间加减运算:plus minus (plusDays、plusHours、plusMinutes、plusSeconds、plusMillis、plusNanos)

		duration = duration.plus(Duration.ofDays(2));duration = duration.minus(Duration.ofDays(1));duration = duration.plusDays(2);duration = duration.minusDays(1);

示例

import java.time.Duration;
import java.time.LocalDateTime;public static void main(String[] args) {LocalDateTime start = LocalDateTime.of(2022,1,1,8,0,0);System.out.println("计算两个时间的差:");LocalDateTime end = LocalDateTime.of(2022,1,2,8,30,30);//创建时间区间 between//Duration duration = Duration.between(start, end);//创建时间区间 parse("PnDTnHnMn.nS")//Duration duration = Duration.parse("PT15M");//创建时间区间 from//Duration du1 = Duration.ofHours(10);//Duration duration = Duration.from(du1);//创建时间区间 Duration.of(long amount, TemporalUnit unit);unit 详见ChronoUnit枚举类//Duration duration = Duration.of(2, ChronoUnit.DAYS);//创建时间区间 Duration.ofDays(long days)Duration duration = Duration.ofDays(2);//区间加减运算:plus minus (days、hours、Minutes、Seconds、Millis、Nanos)duration = duration.plus(Duration.ofDays(2));duration = duration.minus(Duration.ofDays(1));duration = duration.plusDays(2);duration = duration.minusDays(1);long days = duration.toDays();System.out.println("相差:"+days+"天");long hours = duration.toHours();System.out.println("相差:"+hours+"小时");long minutes = duration.toMinutes();System.out.println("相差:"+minutes+"分");long millis = duration.toMillis();System.out.println("相差:"+millis+"毫秒");long nanos = duration.toNanos();System.out.println("相差:"+nanos+"纳秒");}

输出结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JAVA基础] 成员变量和局部变量(一看就懂的总结归纳篇)

引言 成员变量和局部变量在每种编程语言中都有涉及,如果之前了解过其他语言的成员变量或者局部变量,那么在学习java中的成员变量和局部变量时可以看看有那些联系和不同,这一块的东西也不能说难,如果第一次接触可能会感觉有点乱&a…

【Java多线程】内存模型JMM—主内存与工作内存分析

文章目录JAVA内存模型JVM主内存与工作内存描述JVM内存间交互规则JVM先行发生原则内存交互基本操作的 3 个特性原子性(Atomicity)可见性(Visibility)有序性(Ordering)上述内存模型与Java多线程之间的问题JAVA内存模型 共享变量:如果一个变量在多个线程的工作内存中都…

SpringBoot配置MyBatis的sql执行超时时间(mysql)

当某些sql因为不知名原因堵塞时,为了不影响后台服务运行,想要给sql增加执行时间限制,超时后就抛异常,保证后台线程不会因为sql堵塞而堵塞。 方法一 yml全局配置:单数据源可以,多数据源时会失效 方法二 j…

HTTP协议中的302,303状态码

之前也只知道302,303是请求重定向,但是当被问到302,303的具体区别是什么的时候我有点迷,现在就为了加强记忆,来了解下具体情况: 302是http1.0的内容,303是http1.1的内容。301和302本来在规范中是不允许重定向时改变请求方法的(将POST改为GET&#xff09…

Spring自带工具类(断言、ObjectUtils、FileCopyUtils、ResourceUtils、StreamUtils、ReflectionUtils、AopUtils、AopCont)

文章目录断言对象、数组、集合文件、资源、IO 流反射、AOP断言 断言是一个逻辑判断,用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法…

Arrays.asList踩坑——引发的Exception in thread “main“ java.lang.UnsupportedOperationException

Exception in thread “main” java.lang.UnsupportedOperationException 如果你尝试修改Arrays.asList方法生产的List&#xff0c;那么就会报这个错误 public static void main(String[] args) {Integer[] arr new Integer[]{7,8,9};List<Integer> list Arrays.asLi…

GIS算法:JAVA拓扑套件JTS

常用可以用于GIS数据处理和空间计算的java包有geotool和jts。 相对来说&#xff0c;geotool功能更全面&#xff0c;还可以用于数据转换、瓦片地图发布、栅格影像分析等&#xff0c;jts只能进行基本的数据处理和空间计算。 但大多数情况下jts就完全够用了。 geotool的官网&am…

Java本地远程服务器debug调试详解

日常我们debug是经常用的&#xff0c;但是本地还好说&#xff0c;远程debug就有点难度&#xff0c;而且有时候必须要在预演&#xff0c;测试环境的服务器去debug&#xff0c;举个例子&#xff0c;需要https&#xff0c;公网&#xff0c;域名之类的&#xff0c;测试服务器这些有…

Linux “ll“ 命令详解

“ls -l” “ls -al” ll 用来查询当前目录下文件及目录的详情 1.第一位文件类型 普通文件 &#xff0c; d 目录文件&#xff0c;I 链接文件&#xff0c;p 管理文件&#xff0c; b 块设备文件&#xff0c; c 字符设备文件&#xff0c; s 套接字文件 2.文件属性 第一部分表示文…

SpringBoot项目jar发布获取jar包所在目录路径

//第一种File path new File(ResourceUtils.getURL("classpath:").getPath());if(!path.exists()) path new File("");System.out.println(path.getAbsolutePath());//第二种System.out.println(System.getProperty("user.dir"));//第三种Stri…

路径classpath,classpath*,以及file:

./ 当前目录 …/上一层目录 /是根目录 1. classpath : 类路径&#xff0c;指的是编译后的字节码文件存储路径&#xff0c;一般为target目录下的classes目录&#xff08;java项目&#xff09;&#xff0c;在web项目中指的是WEB-INF下的classes目录。实际上&#xff0c;两者其实…

到底什么时候该使用MQ?

一、缘起 一切脱离业务的架构设计与新技术引入都是耍流氓。 引入一个技术之前&#xff0c;首先应该解答的问题是&#xff0c;这个技术解决什么问题。 就像微服务分层架构之前&#xff0c;应该首先回答&#xff0c;为什么要引入微服务&#xff0c;微服务究竟解决什么问题&…

Java中ByteArrayInputStream和ByteArrayOutputStream用法详解

Java中ByteArrayInputStream和ByteArrayOutputStream用法详解 这篇文章主要介绍了Java中ByteArrayInputStream和ByteArrayOutputStream用法详解&#xff0c; ByteArrayInputStream 的内部额外的定义了一个计数器&#xff0c;它被用来跟踪 read() 方法要读取的下一个字节 Byte…

Java中的Base64详解

详解Java中的Base64原理跟用法 简介 ​ Base64编码&#xff0c;是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法, 也是MIME&#xff08;多用途互联网邮件扩展&#xff0c;主要用…

Java程序执行Linux命令

java程序中要执行linux命令主要依赖2个类&#xff1a;Process和Runtime 首先看一下Process类&#xff1a; ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程&#xff0c;并返回 Process 子类的一个实例&#xff0c; 该实例可用来控制进程并获得相关信息。Proces…

ImageIO类说明

最近的项目中遇到ImageIO&#xff0c;因此记录下这个类的用法 一、ImageIO&#xff1a; 这个类中的方法都是静态方法&#xff0c;可以用来进行简单的图片IO操作 1、读入的三种方法 public static BufferedImage read(File input) File file new File("/Users/xixi/Docum…

java:图像(BufferedImage)色彩空间转换(灰度)暨获取图像矩阵数据byte[](sRGB/gray)

ColorConvertOp java.awt.image包下面有个类java.awt.image.ColorConvertOp,类名直译就是”颜色转换操作”。 顾名思义,它的作用就是将一个色彩空间(color space)的图像转换为另一个色彩空间的图像。有了这个神器我们就能轻易的将一张彩色图你像转换成灰度(gray)或其他色彩空间…

MyBatis-Plus updateById方法更新不了空字符串/null解决方法

最近遇到了Mybatis-Plus updateById()&#xff0c;更新某一个字段为null&#xff0c;却发现没有更新成功。记录一下 一、简介 因为最近在忙项目&#xff0c;好久都没有更新博客&#xff0c;最近在项目中刚好遇到一个问题&#xff0c;就是在使用MyBatis-Plus updateById&#…

Java 分割字符串的方法String.split()底层原理与使用

文章目录split()底层原理1.举例说明2.split源码分析3.API原解4.regex参数API原解5.limit参数介绍6.结果的验证7.此方法的使用split方法的使用split用法分析参数解释—regex参数解释—limit不同limit值的情况下的split结果验证扩展split()底层原理 1.举例说明 1.最普通的用法 …

HttpClient使用和详解

文章目录一、关于HttpClient二、HttpClient使用步骤详解1、创建一个HttpClient对象A、HttpCLientConnectionManagerB、HttpRoutePlannerC、RequestConfig2、创建一个Request对象3、执行Request请求4、处理response1&#xff09;关闭和entity相关的content stream2&#xff09;关…