目录
  • 简介
  • Duration和Period
  • 创建方法
    • 通过时间单位创建
    • 通过LocalDate创建
  • 解析方法
    • 比较方法
      • 增减方法
        • 转换单位
          • 取值方法

            简介

            本文用示例介绍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用法

            见:详解Java中Duration类的使用方法

            创建方法

            通过时间单位创建

            如果仅一个值表示,如使用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);
            // 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都可以用大写或者小写。

            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天
            

            源码

            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) {
                    // 其他代码
                }
             
                // 其他代码
            }
            

            获得年月日

            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
            声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。