首页 > 编程语言 >java jdk8 时间系列 Duration和Period的使用

java jdk8 时间系列 Duration和Period的使用

时间:2023-03-08 12:11:17浏览次数:43  
标签:java Period period parse duration jdk8 Duration LocalDate

简介

Duration类通过年月日时分秒相结合来描述一个时间量,最高精度是纳秒。时间量可以为正也可以为负,比如1天(86400秒0纳秒)、-1天(-86400秒0纳秒)、1年(31556952秒0纳秒)、1毫秒(0秒1000000纳秒)等。
Period类通过年月日相结合来描述一个时间量,最高精度是。时间量可以为正也可以为负,例如2年(2年0个月0天)、3个月(0年3个月0天)、4天(0年0月4天)等。
这两个类是不可变的、线程安全的、最终类。都是JDK8新增的。

Duration的使用

创建方法

通过时间单位创建

基于天、时、分、秒、纳秒创建。

ofDays(), ofHours(), ofMillis(), ofMinutes(), ofNanos(), ofSeconds()。例如:

Duration fromDays = Duration.ofDays(1);
// 获取一天的秒数
fromDays.getSeconds();

通过LocalDateTime或LocalTime

通过LocalDateTime或者LocalTime 类,然后使用between获取创建Duration。


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);

通过已有的Duration

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

解析方法

用法示例

Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
Duration fromChar2 = Duration.parse("PT10M");

格式说明

采用ISO-8601时间格式。格式为:PnYnMnDTnHnMnS (n为个数)

例如:P1Y2M10DT2H30M15.03S

  • P:开始标记
  • 1Y:一年
  • 2M:两个月
  • 10D:十天
  • T:日期和时间的分割标记
  • 2H:两个小时
  • 30M:三十分钟
  • 15S:15.02秒

详解

1、"P", "D", "H", "M" 和 "S"可以是大写或者小写(建议大写)
2、可以用“-”表示负数

示例大全

"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"

比较方法

比较两个时间的差

Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
Instant end = Instant.parse("2017-10-03T10:16:30.00Z");

// 使用这个也可以,需要支持 seconds 的时间类 
LocalDateTime now = LocalDateTime.now()
 
// end - start        
Duration duration = Duration.between(start, end);
 
// 任何一个时间单元为负数,则返回true。true:end早于start
duration.isNegative();
 
Duration.between(start, end).getSeconds();
Duration.between(start, end).getNano();

增减方法

plusX()、minusX()

X表示days, hours, millis, minutes, nanos 或 seconds

Duration duration = Duration.ofHours(2);
Duration newDuration = duration.plusSeconds(33);

plus()/minus()方法

带TemporalUnit 类型参数进行加减:

Duration duration = Duration.ofHours(2);
Duration newDuration = duration.plus(33, ChronoUnit.SECONDS);

转换单位

可以用toX来转换为其他单位,支持:toDays, toHours, toMinutes, toMillis, toNanos

Duration duration = Duration.ofHours(2);
 
duration.toDays();     // 0
duration.toHours();    // 2
duration.toMinutes();  // 120
duration.toMillis();   // 7200000
duration.toNanos();    // 7200000000000

取值方法

可以用getX来获得指定位置的值,因为Duration是由秒和纳秒组成,所以只能获得秒和纳秒:

Duration duration = Duration.ofHours(2);
 
duration.getSeconds();  //7200
duration.getNano();     //0

Period的使用

创建方法

通过时间单位创建

如果仅一个值表示,如使用ofDays()方法,那么其他值为0。
若仅用ofWeeks,则其天数为week数乘以7.

Period fromUnits = Period.of(3, 10, 10);
Period fromDays = Period.ofDays(50);
Period fromMonths = Period.ofMonths(5);
Period fromYears = Period.ofYears(10);
Period fromWeeks = Period.ofWeeks(40);  //280天

通过LocalDate创建


LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);
// endDate减startDate
Period period = Period.between(startDate, endDate);

解析方法

格式1:“PnYnMnWnD”

  • P:开始符,表示period(即:表示年月日);
  • Y:year;
  • M:month;
  • W:week;
  • D:day

P, Y, M, W, D都可以用大写或者小写。

Period period = Period.parse("P2Y");       //2年
Period period = Period.parse("P2Y3M5D");   //2年3月5天
Period period = Period.parse("P1Y2M3W4D"); // 1年2月3周4天。即:1年2月25天

获得年月日

period.getYears();
period.getMonths();
period.getDays();

比较方法

用between来比较日期。


LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);
// startDate减endDate
Period period = Period.between(startDate, endDate);
// 任何一个时间单元为负数,则返回true。true:endDate早于startDate
period.isNegative()

增减方法

Period period = Period.parse("P2Y3M5D");
period.plusDays(50);
period.minusMonths(2);

转换单位

Period period = Period.parse("P1Y2M3D");
period.toTotalMonths(); // 14

取值方法

Period period = Period.parse("P1Y2M3D");
period.getYears();  // 1
period.getMonths(); // 2
period.getDays();   // 3

原文章地址:

https://blog.csdn.net/feiying0canglang/article/details/124918218
https://knife.blog.csdn.net/article/details/122772818

标签:java,Period,period,parse,duration,jdk8,Duration,LocalDate
From: https://www.cnblogs.com/2393920029-qq/p/17191029.html

相关文章

  • JAVA 实现导入导出Excel-随笔
    1、开个小差今天是我第一次使用博客园记录随笔内容;从-CSDN->Typora->语雀其中的转换过程中,让我清楚这三个工具都比博客园记录随笔要轻松的多;话又说回来,那么我又为什么......
  • java map集合的获取功能
       ......
  • Java分布式应用:性能调优
    第五部分性能调优性能瓶颈的表象:1.资源消耗过多、外部处理系统的性能不足2.资源消耗不多,但程序的响应速度不够关于CPU通常使用时间片、多核的方法达到对CPU的分割;每个C......
  • Java分布式应用:分布式Java应用与Sun JDK类库
    第四部分分布式Java应用与SunJDK类库集合包CollectionList接口:List接口:List(有序、可重复)的实现类有ArrayList、Vector、LinkListArrayList、Vector底层是通过数组实现......
  • Java分布式应用:深入了解JVM
    第三部分深入理解JVMJava代码的执行过程Java源码编译机制javac将java源码转换成javaclass字节码java运行javaclass字节码Java编译后产生的是字节码,在运行的时候将字......
  • Java基础面试(三)
    Java基础面试(三)1.Java一个类当中如果没有构造函数,编译器会自动生成一个缺省的构造函数;如果这个类有其他的构造函数,编译器则不会提供缺省构造参数。2.SpringMVC与Struct2.......
  • 实现动态切换版本JDK8和JAVA17
    一、下载安装两个版本的JDK官网下载地址:JavaDownloads|Oracle下载安装成功后,安装路径E:\Java\上 JDK8 有两个包一个jdk1.8.0_231,一个jre1.8.0_231。JDK17只有一个j......
  • java map集合的基本功能
          ......
  • java标识符,关键字和运算符
    Java标识符和关键字数据类型​Java数据类型分为基本类型和引用类型。基本类型整数类型:byte,占一个字节范围:-128~127short,占两个字节范围:-32768-32767int,占4个字......
  • jmeter发送java请求
    本文描述jmeter如何发送java请求1.编写java请求,将加密、签名等封装,对外只暴露需要传的业务参数,jemter发送java请求时直接传入业务参数即可  具体代码如下:importco......