Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
程序员文章站
2022-06-07 11:26:44
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天,所以计算不准确。
推荐阅读
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别