Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别

1.Period

final修饰,线程安全,ISO-8601日历系统中基于日期的时间量,例如2年3个月4天。

主要属性:年数,月数,天数。

    /**
     * The number of years.
     */
    private final int years;
    /**
     * The number of months.
     */
    private final int months;
    /**
     * The number of days.
     */
    private final int days;

用于时间量,比较2个日期。

例如:

     LocalDate localDate1 = LocalDate.of(2019, 11, 15);
        LocalDate localDate2 = LocalDate.of(2020, 1, 1);
        Period p = Period.between(localDate1, localDate2);
        System.out.println("years:"+p.getYears()+" months:"+p.getMonths()+" days:"+p.getDays());

输出:

years:0 months:1 days:17

2.Duration

final修饰,线程安全,基于时间的时间量,如“34.5秒”。

主要属性:秒,纳秒

    /**
     * The number of seconds in the duration.
     */
    private final long seconds;
    /**
     * The number of nanoseconds in the duration, expressed as a fraction of the
     * number of seconds. This is always positive, and never exceeds 999,999,999.
     */
    private final int nanos;

用于时间量,比较2个时间。

例如:

        LocalDateTime localDateTime1 = LocalDateTime.of(2019, 11, 15, 0, 0);
        LocalDateTime localDateTime2 = LocalDateTime.of(2019, 11, 15, 10, 30);
        Duration d = Duration.between(localDateTime1, localDateTime2);
        System.out.println("days:"+d.toDays());
        System.out.println("hours:"+d.toHours());
        System.out.println("minutes:"+d.toMinutes());
        System.out.println("millis:"+d.toMillis());

输出:

days:0
hours:10
minutes:630
millis:37800000

3.Period和Duration的区别

(1)包含属性不同

Period包含年数,月数,天数,而Duration只包含秒,纳秒。

Period只能返回年数,月数,天数;Duration可以返回天数,小时数,分钟数,毫秒数等。

(2)between方法可以使用的类型不同

Period只能使用LocalDate,Duration可以使用所有包含了time部分且实现了Temporal接口的类,比如LocalDateTime,LocalTime和Instant等。

Period:

public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)

Duration:

public static Duration between(Temporal startInclusive, Temporal endExclusive)

(3)between获取天数差的区别

通过上面的实例可以看出:

Period  p.getDays()  获取天数时,只会获取days属性值,而不会将年月部分都计算成天数,不会有2020.1.1和2019.1.1比较后获取天数为365天的情况。

    public int getDays() {
        return days;
    }

Duration d.toDays()  获取天数时,会将秒属性转换成天数。

    public long toDays() {
        return seconds / SECONDS_PER_DAY;
    }

所以,想要获取2个时间的相差总天数,只能用Duration。

(4)Period有获取总月数的方法,为什么没有获取总天数方法?

Period有获取总月数的方法:

    public long toTotalMonths() {
        return years * 12L + months;  // no overflow
    }

为什么没有获取总天数方法?

因为between后获取到的Period,不会记录2个日期中间的闰年信息,有闰年的存在,每年的天数不一定是365天,所以计算不准确。

原文地址:https://www.cnblogs.com/xkzhangsanx/p/12110137.html

时间: 2024-08-27 17:09:33

Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别的相关文章

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不

Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包

最开始是想将各个类分门别类地存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的:   很明显建立项目后的架构是上图右边这样的,所以后面理所当然地选择new-->package,name栏填上activity,然而结果是下面左边这样的... 这样的结果明显与预想的不一样,我们看到activity与com.mukekeweather.app是并行结构,而我们需要的是树状结构的 查了很多资料之后才弄明白这个问题,因

Andriod项目实战——如何在微信H5棋牌斗牛房卡源码平台租售搭建中的一个包下建新包教程

最开始是想将各个类分门别类地微信H5棋牌斗牛房卡源码平台租售搭网址:h5.fanshubbs.com联系Q1687054422存放在不同的包中,所以想在项目源码包中新建几个不同功能的包eg:utils.model.receiver等,最后的结果应该是下图左边这样的: 很明显建立项目后的架构是上图右边这样的,所以后面理所当然地选择new-->package,name栏填上activity,然而结果是下面左边这样的... 这样的结果明显与预想的不一样,我们看到activity与com.mukekew

Mac 如何导出ipa文件中Assets.car包中的切图

在之前 获取 AppStore 中 应用 的 IPA 包文件(Mac OS 13+)中获取到应用的 IPA 包,可以取出应用的部分图片(如 Logo),如果项目工程中把图片添加到 Assets.xcassets 中的话,只能在包中看到 Assets.car 文件,这时需要把里面的图片资源取出来. 在 Github 上 cartool是专门解决这个问题的开源工具,下载,使用 Xcode 打开工程,添加如下配置: 运行工程,就可以看到控制台有输出 Log 在指定文件中就会有解压过的图片资源. 原文地

(转)Eclipse中查看jar包中的源码

Java Decompiler Plugin For Eclipse IDE 1. 下载JAD ,  1.5.8版本的jad在 http://www.softpedia.com/progDownload/JAD-Download-85911.html 将展开后的jad.exe放到某个目录,例如 c:/jad/jad.exe 2. 下载JADClipse插件 http://sourceforge.net/projects/jadclipse/files/ 将展开后的net.sf.jadclipse

spring boot中装配依赖包中的@Configuration

org.springframework.boot.autoconfigure.EnableAutoConfiguration=indi.cyh.jdbctool.modle.DbConfig https://blog.csdn.net/SkyeBeFreeman/article/details/96291283 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\indi.cyh.jdbctool.modle.DbCon

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

Java8新特性之:新的日期和时间API

一. LocalDate.LocalTime.Instant.Duration以及Period 1.LocalDate只提供日期,不含当天时间信息 LocalDate date = LocalDate.of(2018, 5, 03); int year = date.getYear(); Month month = date.getMonth(); int day = date.getDayOfMonth(); DayOfWeek dow = date.getDayOfWeek(); int l

Web API系列(三)统一异常处理

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前面讲了webapi的安全验证和参数安全,不清楚的朋友,可以看看前面的文章,<Web API系列(二)接口安全和参数校验>,本文主要介绍Web API异常结果的处理.作为内部或者是对外提供的统一webapi 接口,统一的异常处理,把正确的信息