• java.time.TemporalAmount详解


    目录

    Duration常用方法

    静态方法:主要用于创建Duration对象

    实例方法

    判断类方法

    增加类方法

    减少类方法

    数值转换类方法

    替换类方法

    Period常用方法

    静态方法

    实例方法


    TemporalAmount是Java.time包下的一个接口,表示一段具体的时间(如:5天、1小时、3分钟等),时间可以是负数。TemporalAmount有两个常见的实现类:Duration和Period。

    在开始前,对TemporalUnit有所了解可以更容易阅读本文。

    Duration常用方法

    Duration是基于时间的实现,存储秒和纳秒,但使用其他基于持续时间的单位提供一些访问,如分钟、小时和固定的24小时天。

    静态方法:主要用于创建Duration对象

    1、static Duration of(long amount, TemporalUnit unit):通过指定的数量和时间单位创建

    2、static Duration ofDays(long days):创建指定天数

    3、static Duration ofHours(long hours):创建指定小时数

    4、static Duration ofMinutes(long minutes):创建指定分钟数

    5、static Duration ofSeconds(long seconds):创建指定秒数

    6、static Duration ofSeconds(long seconds, long nanoAdjustment):创建指定秒数+纳秒数

    7、static Duration ofMillis(long millis):创建指定微秒数

    8、static Duration ofNanos(long nanos):创建指定纳秒数

    9、static Duration parse(CharSequence text):解析指定字符序列来得到一个Duration对象,字符序列的格式说明如下,我们常见的java.lang.String就是CharSequence的一个实现类。

    "PT20.345S" :会被解析为20.345秒
    "PT15M" :会被解析为15分钟
    "PT10H"  :会被解析为10小时
    "P2D"  :会被解析为2天
    "P2DT3H4M" :会被解析为2天3小时4分钟
    "P-6H3M" :会被解析为-6小时+3分钟
    "-P6H3M" :会被解析为-6小时-3分钟
    "-P-6H+3M" :会被解析为+6小时3分钟

    实例方法

    1、long get(TemporalUnit unit):用于获取时间中包含的秒数或纳秒数,该方法只接受ChronoUnit.SECONDS和ChronoUnit.NANOS,否则抛出异常。当给定时间是整数的秒时,获取纳秒为0,因为Duration通过秒和纳秒保存时间,会先创建一个0秒0纳秒的时间,然后在这个基础上增加,满10^9纳秒进1

    public static final Duration ZERO = new Duration(0, 0);

    方法的源码如下:

    1. public long get(TemporalUnit unit) {
    2. if (unit == SECONDS) {
    3. return seconds;
    4. } else if (unit == NANOS) {
    5. return nanos;
    6. } else {
    7. throw new UnsupportedTemporalTypeException("Unsupported unit: " + unit);
    8. }
    9. }

    2、public Duration abs():返回当前时间的绝对值,如:PT-1.3S会变成PT1.3S

    3、Duration dividedBy(long divisor):除法运算

    1. Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT10D
    2. // 10天=240小时 240小时/3=80小时,不能通过天数完整表示,转化为小时表示
    3. System.out.println(duration.dividedBy(3)); // PT80H

    4、long getSeconds():获取秒数

    5、int getNano():获取纳秒数(如果给定时间不是整数秒时返回非0)

    6、List getUnits():获取Duration的单位,该类使用ChronoUnit.Seconds和ChronoUnit.Nanos实现时间的存储,故该方法返回[Seconds, Nanos]

    判断类方法

    1、boolean isNegative():判断时间是否负数

    2、boolean isZero():判断时间是否为0(seconds和nanos都为0)

    3、Duration negated():返回给定时间的相反数

    增加类方法

    1、Duration plus(Duration duration):两个时间相加

    2、Duration plus(long amountToAdd, TemporalUnit unit):指定时间单位添加,如:

    1. Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT240H
    2. // 加5天
    3. System.out.println(duration.plus(5, ChronoUnit.DAYS)); // PT360H

    3、Duration plusDays(long daysToAdd):增加指定天数

    4、Duration plusHours(long hoursToAdd):增加指定小时数

    5、Duration plusMinutes(long minutesToAdd):增加指定分钟数

    6、Duration plusSeconds(long secondsToAdd):增加指定秒数

    7、Duration plusMillis(long millisToAdd):增加指定微秒数

    8、Duration plusNanos(long nanosToAdd):增加指定纳秒数

    减少类方法

    1、Duration minus(Duration duration):减少指定小时数

    2、Duration minus(long amountToSubtract, TemporalUnit unit):减少指定时间数

    1. Duration duration = Duration.of(10, ChronoUnit.DAYS); // PT240H
    2. // 减5天,即120小时
    3. System.out.println(duration.minus(5, ChronoUnit.DAYS)); // PT120H

    3、Duration minusDays(long daysToSubtract):减少指定天数

    4、Duration minusHours(long hoursToSubtract):减少指定小时数

    5、Duration minusMinutes(long minutesToSubtract):减少指定分钟数

    6、Duration minusSeconds(long secondsToSubtract):减少指定秒数

    7、Duration minusMillis(long millisToSubtract):减少指定微秒数

    8、Duration minusNanos(long nanosToSubtract):减少指定纳秒数

    数值转换类方法

    1、long toDays():转化为天数

    2、long toHours():转化为小时数

    3、long toMinutes():转化为分钟数

    4、long toMillis():转化为微秒数

    5、long toNanos():转化为纳秒数

    替换类方法

    1、Duration withSeconds(long seconds):使用给定秒替换当前时间的秒数生成一个新的时间

    1. public class DurationExample {
    2. public static void main(String[] args) {
    3. Duration nanos = Duration.ofNanos(6); // 6纳秒
    4. Duration duration = nanos.withSeconds(5); // 5秒
    5. System.out.println(duration); // PT5.000000006S
    6. }
    7. }

    2、Duration withNanos(int nanoOfSecond):使用给定纳秒替换当前时间的纳秒数生成一个新的时间

    1. public class DurationExample {
    2. public static void main(String[] args) {
    3. Duration seconds = Duration.ofMinutes(10); // 10分钟
    4. Duration duration = seconds.withNanos(5); // 5纳秒
    5. System.out.println(duration); // PT10M0.000000005S
    6. }
    7. }

    Period常用方法

    Period是一个基于日期的实现,存储年、月和天。

    静态方法

    1、static Period ofYears(int years):创建指定年数

    2、static Period ofMonths(int months):创建指定月数

    3、static Period ofWeeks(int weeks):创建指定周数

    4、static Period ofDays(int days):创建指定天数

    5、static Period between(LocalDate start, LocalDate end):计算end和start之间间隔的时间,时间的单位以end的单位为准

    6、static Period parse(CharSequence text):通过解析指定字符序列生成Period对象(注意:字符序列格式为"P+[数字]+[Y/M/D]"),例如"P3M4D5"表示3年4个月5天

    7、static Period from(TemporalAmount amount):从指定对象创建,作用相当于复制

    实例方法

    1、IsoChronology getChronology():获取此时期的年表,即ISO日历系统。年表表示正在使用的日历系统

    2、long get(TemporalUnit unit):获取指定的单位数,该方法只接收YEARS、MONTHS和DAYS

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.of(5, 6, 7);
    4. System.out.println(period.get(ChronoUnit.YEARS)); // 获取年数:5
    5. System.out.println(period.get(ChronoUnit.MONTHS)); // 获取月数:6
    6. System.out.println(period.get(ChronoUnit.DAYS)); // 获取天数:7
    7. }
    8. }

    3、Period normalized():将时间标准化,例如:“5年零15个月”的期间将被标准化为“6年零3个月”

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.of(5, 15, 7);
    4. System.out.println(period.normalized()); // P6Y3M7D
    5. }
    6. }

    4、long toTotalMonths():将当前时间转为月数

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.of(5, 6, 7); // 5年6个月零7天
    4. // 转为月:5*12+6=66,7天不足一个月,舍弃
    5. System.out.println(period.toTotalMonths()); // 66
    6. }
    7. }

    5、Period withYears(int years):使用指定年数替换当前时间的年数生成一个新的时间

    6、Period withMonths(int months):使用指定月数替换当前时间的月数生成一个新的时间

    7、Period withDays(int days):使用指定天数替换当前时间的天数生成一个新的时间

    8、Period multipliedBy(int scalar):当前时间乘以指定的数值

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.of(5, 6, 7); // PT5Y6M7D
    4. System.out.println(period.multipliedBy(5)); // PT25Y30M35D
    5. }
    6. }

    9、Temporal subtractFrom(Temporal temporal):从指定时间中减掉当前时间

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.of(5, 6, 7);
    4. System.out.println(period.subtractFrom(LocalDate.now())); // 2017-03-14
    5. }
    6. }

    因为以上创建Period时指定了年月日,所以传入的Temporal 至少需要包含年月日,可选LocalDate和LocalDateTime。Temporal常见的实现类有Year(年)、YearMonth(年月)、LocalTime(时分秒)、LocalDate(年月日)和LocalDateTime(年月日 时分秒)。

    1. public class PeriodExample {
    2. public static void main(String[] args) {
    3. Period period = Period.ofYears(365);
    4. System.out.println(period.subtractFrom(Year.of(366))); // 1
    5. }
    6. }

  • 相关阅读:
    magma build system 分析 —— 第04记 make -n 的记录
    STM32启动分析之main函数是怎样跑起来的
    点灯科技实现 “ESP8266-01/01s + 继电器” 远程开关
    [山东科技大学OJ]1370 Problem C: 编写函数:字符串的连接 之三 (Append Code)
    指定程序在哪个GPU上运行
    spring源码-spring启动(待完善)
    SRDenseNet
    了解这几点,让你轻松掌握滑台模组的选型方法!
    地理地形sdk:Tatuk GIS Developer Kernel for .NET Crack
    linux常用命令
  • 原文地址:https://blog.csdn.net/heyl163_/article/details/126944493