简介
本文用示例介绍java的Period的用法。
Duration和Period
说明
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()方法,那么其他值为0。
若仅用ofWeeks,则其天数为week数乘以7.
1
2
3
4
5
|
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创建
1
2
3
4
|
LocalDate startDate = LocalDate.of( 2015 , 2 , 20 ); LocalDate endDate = LocalDate.of( 2017 , 1 , 15 ); // startDate减endDate Period period = Period.between(startDate, endDate); |
解析方法
格式1:“PnYnMnWnD”
P:开始符,表示period(即:表示年月日);
Y:year;
M:month;
W:week;
D:day
P, Y, M, W, D都可以用大写或者小写。
1
2
3
|
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天 |
源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
public final class Period implements ChronoPeriod, Serializable { //----------------------------------------------------------------------- /** * Obtains a {@code Period} from a text string such as {@code PnYnMnD}. * <p> * This will parse the string produced by {@code toString()} which is * based on the ISO-8601 period formats {@code PnYnMnD} and {@code PnW}. * <p> * The string starts with an optional sign, denoted by the ASCII negative * or positive symbol. If negative, the whole period is negated. * The ASCII letter "P" is next in upper or lower case. * There are then four sections, each consisting of a number and a suffix. * At least one of the four sections must be present. * The sections have suffixes in ASCII of "Y", "M", "W" and "D" for * years, months, weeks and days, accepted in upper or lower case. * The suffixes must occur in order. * The number part of each section must consist of ASCII digits. * The number may be prefixed by the ASCII negative or positive symbol. * The number must parse to an {@code int}. * <p> * The leading plus/minus sign, and negative values for other units are * not part of the ISO-8601 standard. In addition, ISO-8601 does not * permit mixing between the {@code PnYnMnD} and {@code PnW} formats. * Any week-based input is multiplied by 7 and treated as a number of days. * <p> * For example, the following are valid inputs: * <pre> * "P2Y" -- Period.ofYears(2) * "P3M" -- Period.ofMonths(3) * "P4W" -- Period.ofWeeks(4) * "P5D" -- Period.ofDays(5) * "P1Y2M3D" -- Period.of(1, 2, 3) * "P1Y2M3W4D" -- Period.of(1, 2, 25) * "P-1Y2M" -- Period.of(-1, 2, 0) * "-P1Y2M" -- Period.of(-1, -2, 0) * </pre> * * @param text the text to parse, not null * @return the parsed period, not null * @throws DateTimeParseException if the text cannot be parsed to a period */ public static Period parse(CharSequence text) { // 其他代码 } // 其他代码 } |
获得年月日
1
2
3
|
period.getYears(); period.getMonths(); period.getDays(); |
比较方法
用between来比较日期。
1
2
3
4
5
6
|
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() |
增减方法
1
2
3
|
Period period = Period.parse( "P2Y3M5D" ); period.plusDays( 50 ); period.minusMonths( 2 ); |
转换单位
1
2
|
Period period = Period.parse( "P1Y2M3D" ); period.toTotalMonths(); // 14 |
取值方法
1
2
3
4
|
Period period = Period.parse( "P1Y2M3D" ); period.getYears(); // 1 period.getMonths(); // 2 period.getDays(); // 3 |
到此这篇关于详解Java中Period类的使用方法的文章就介绍到这了,更多相关Java Period类内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://knife.blog.csdn.net/article/details/122772818