JDK1.8 新特性 Date-LocalDate类

562 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

LocalDate

这三个属性是final,因此属性不可改变.当plus和minus时,不会改变当前对象,而是产生新的对象.

		private final int year;
    private final short month;
    private final short day;

通过now()方法获取当前时间

LocalDate date = LocalDate.now();     // 2021-11-08

// 获取年份
int year = date.getYear();
// 获取月份的枚举
Month month = date.getMonth();
// 获取月份
int monthValue = date.getMonthValue();
// 获取日期
int dayOfMonth = date.getDayOfMonth();
// 获取星期
DayOfWeek dayOfWeek = date.getDayOfWeek();

对LocalDate对象进行操作.

  • 通过getYear() 获取当前年份
  • 通过getMonth() 获取当前月份的枚举类型
  • 通过getMonthValue()获取月份值
  • 通过getDayOfMonth() 获取日期
  • 通过getDayOfWeek()获取星期

生成localDate

1.通过now()方法创建LocalDate对象

LocalDate date = LocalDate.now();     //2021-11-08

2.of()方法手动生成localDate对象

当手动创建的不符合规范,就会报错,如2021-13-42

// 年-月-日
LocalDate of = LocalDate.of(1, 1, 1);    //0001-1-1
// 年,年当中的日期
LocalDate localDate1 = LocalDate.ofYearDay(2021, 222);   // 2021-08-10

获取年月日

通过get方法即可获取.

其中,获取day是getDayOfMonth() 方法.

				int year1 = localDate2.getYear();
        Month month1 = localDate2.getMonth();
        int dayOfMonth1 = localDate2.getDayOfMonth();

是否为闰年

isLeapYear() 判断当前localDate对象是否为闰年

LocalDate localDate1 = LocalDate.ofYearDay(2020, 222);   //2020-08-09
        boolean leapYear = localDate1.isLeapYear();     // yes

// 源码  
public boolean isLeapYear(long prolepticYear) {
        return ((prolepticYear & 3) == 0) && ((prolepticYear % 100) != 0 || (prolepticYear % 400) == 0);
    }

lengthOfYear 返回当前对象一年包含的天数.闰年返回366天

源码就是通过isLeapYear方法判断是否为闰年来返回天数

int dayOfYear = localDate1.lengthOfYear();    //366

// 源码
public int lengthOfYear() {
        return (isLeapYear() ? 366 : 365);
    }

增加减少

  • 增加:plus

    • plusYears
    • plusMonths
    • plusDays
  • 减少:minus

    • minusYears
    • minusMonths
    • minusDays

LocalDate直接增加月份.

对LocalDate进行plusMonth()方法增加指定的月份,会得到一个新的LocalDate对象.

minusMonths() 减少月份

				LocalDate date = LocalDate.now();   // 2021-11-08
				// 月份增加1得到一个新的对象
        LocalDate localDate = date.plusMonths(1);   //2021-12-08

比较

isAfter() 判断当前的对象是否比目标对象迟

源码通过提取年月日相减进行比较.当年相减为0时,才会进行月相减.否则直接返回相减结果.然后对结果进行判断,如果大于0,那么返回true.

isBefore

isEqual localDate的rquals进行了重写,基本上等于isEquals方法.多了一个地址的判断.

				LocalDate date = LocalDate.now();    // 2021-11-08
        LocalDate localDate1 = LocalDate.ofYearDay(2020, 222);  //2020-08-09
        // 日期比较
        boolean after = localDate.isAfter(localDate1);    //true

// 源码
public boolean isAfter(ChronoLocalDate other) {
        if (other instanceof LocalDate) {
            return compareTo0((LocalDate) other) > 0;
        }
        return ChronoLocalDate.super.isAfter(other);
    }

// 调用的下面的方法
int compareTo0(LocalDate otherDate) {
        int cmp = (year - otherDate.year);
        if (cmp == 0) {
            cmp = (month - otherDate.month);
            if (cmp == 0) {
                cmp = (day - otherDate.day);
            }
        }
        return cmp;
    }