Java8新特性 - LocalDate 日期类的基本使用

1.说明

LocalDate 类 是 Java8中新增的日期类,采用了系统的默认时区。
可以方便的处理 日期对象 的 年、月、日 信息。

2.常用API

2.1 获取LocalDate 对象

 * 1.创建日期对象
 *   1.1 获取当前日期对象
 *       LocalDate.now() : 返回默认时区下的、系统始终下的 当前日期
 *       LocalDate.now(Clock clock) : 返回指定时钟的 当前日期
 *       LocalDate.now(ZoneId zone) : 返回指定时区的 当前日期
 *       【补充:获取所有时区信息的方式 : ZoneId.getAvailableZoneIds()】
 *   1.2 获取指定日期对象
 *       LocalDate.of(int year, Month month, int dayOfMonth) : 指定年、月份名称、日期
 *       LocalDate.of(int year, int month, int dayOfMonth) : 指定 年、月份数字、日期
 *       LocalDate.ofYearDay(int year, int dayOfYear) : 指定 年分、这一年的第几天
 *       LocalDate.ofEpochDay(long epochDay) : 指定 距离 1970-01-01 00:00:00 的天数
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
        //1.1 获取当前日期
        LocalDate now01 = LocalDate.now();
        System.out.println("now01 = " + now01);
        LocalDate now02 = LocalDate.now(Clock.systemUTC());// UTC/GMT 标准时区时间,零时区/中时区
        System.out.println("now02 = " + now02);
        LocalDate now03 = LocalDate.now(ZoneId.of("Asia/Shanghai"));
        System.out.println("now03 = " + now03);
        System.out.println("============================");

        //1.2 获取指定日期
        LocalDate localDate01 = LocalDate.of(2022, Month.MARCH, 20);
        System.out.println("localDate01 = " + localDate01);
        LocalDate localDate02 = LocalDate.of(2022, 3, 20);
        System.out.println("localDate02 = " + localDate02);
        LocalDate localDate03 = LocalDate.ofYearDay(2022, 6); // 2022-01-06
        System.out.println("localDate03 = " + localDate03);
        LocalDate localDate04 = LocalDate.ofEpochDay(3);// 距离 1970-01-01 00:00:00 三天的日期,还是 1970-01-04
        System.out.println("localDate04 = " + localDate04);

        System.out.println("============================");

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第1张图片

2.2 获取 LocalDate 对象的 年月日信息

 * 2.获取日期对象的 年、月、日 信息
 *      getYear() : 获取年分信息
 *      getMonth() : 获取月份信息(枚举类型)
 *      getMonthValue() : 获取月份的数字(数值类型)
 *      getDayOfMonth() : 获取日期信息
 *      getDayOfWeek() : 获取星期几 (枚举类型)
 *      getDayOfYear() : 获取这一年的第几天
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
         //2.获取日期对象的年月日
        LocalDate today = LocalDate.now();
        System.out.println("年分 : " + today.getYear());
        System.out.println("月份 : " + today.getMonth() + " ; 月份 : "+today.getMonth().getValue()+" ; 月份 : " + today.getMonthValue());
        System.out.println("日期 : " + today.getDayOfMonth());
        System.out.println("星期 : " + today.getDayOfWeek()+" ; 星期 : "+today.getDayOfWeek().getValue());
        System.out.println("今年的第几天 : " + today.getDayOfYear());

        System.out.println("============================");

        //  获取时区的方法 : Asia/Shanghai
//        Set asia = ZoneId.getAvailableZoneIds()
//                .stream()
//                .filter(s -> s.startsWith("Asia"))
//                .collect(Collectors.toSet());
//        System.out.println(asia);

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第2张图片

2.3 修改LocalDate 对象的 年月日信息

 *  3.指定 日期对象的属性
 *      withYear(int) : 设置年
 *      withMonth(int) : 设置月
 *      withDayOfMonth(int) : 设置日
 *      withDayOfYear(int) : 设置这一年的第几天
 *
 *      with(TemporalAdjuster) : 时间调整器,更方便的调整
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
       // 3.指定日期 年、月、日 属性
        LocalDate nowWith = LocalDate.now();
        System.out.println("now = " + nowWith);
        System.out.println("指定年分2025年 = " + nowWith.withYear(2025));
        System.out.println("指定月份6月 = " + nowWith.withMonth(6));
        System.out.println("指定日期15号 = " + nowWith.withDayOfMonth(15));
        System.out.println("指定日期这一年的第2天 = " + nowWith.withDayOfYear(2));

        System.out.println();

        // 时间矫正器 : 调整到下个月的1号
        // 1.手动调整
        TemporalAdjuster  temporalAdjuster01 = (temporal)->{
            System.out.println("temporal = "+temporal);
            LocalDate localDate = (LocalDate) temporal;
            localDate = localDate.withMonth(localDate.getMonthValue()+1)
                                    .withDayOfMonth(1); //  注意对象是线程安全的,所以必须要重新接收一边
            System.out.println("localDate = " + localDate);
            return localDate;
        };
        LocalDate withTemporalAdjuster01 = nowWith.with(temporalAdjuster01);
        System.out.println("withTemporalAdjuster01 = " + withTemporalAdjuster01);
        
        //2.使用已经封装好的
        LocalDate withTemporalAdjuster02 = nowWith.with(TemporalAdjusters.firstDayOfNextMonth()); // 现成的方法
        System.out.println("withTemporalAdjuster02 = " + withTemporalAdjuster02);

        LocalDate withTemporalAdjuster03 = nowWith.with(TemporalAdjusters.dayOfWeekInMonth(1,DayOfWeek.MONDAY)); // 调整到这个月的第一个星期一
        System.out.println("withTemporalAdjuster03 = " + withTemporalAdjuster03);


        System.out.println("============================");

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第3张图片

2.4 增加/减少 LocalDate 对象的 年月日 信息

 *  4.加上 或者 减去 年、月、日、周
 *      plusYears(long) : 加几年
 *      plusMonths(long) : 加几个月
 *      plusDays(long) : 加几天
 *      plusWeeks(long) : 加几个星期
 *
 *      minusYears(long) : 减几年
 *      minusMonths(long) : 减几个月
 *      minusDays(long) : 减几天
 *      minusWeeks(long) : 减几个星期
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
    
      	// 4. 加上 或者 减去 指定数量 年份、月份、天数、周数
        LocalDate nowPlusOrMin = LocalDate.now();
        System.out.println("nowPlusOrMin = " + nowPlusOrMin);
        System.out.println("加两年 = " + nowPlusOrMin.plusYears(2));
        System.out.println("加13个月 = " + nowPlusOrMin.plusMonths(13));
        System.out.println("加12天 = " + nowPlusOrMin.plusDays(12));
        System.out.println("加一周 = " + nowPlusOrMin.plusWeeks(1));
        System.out.println();
        System.out.println("减两年 = " + nowPlusOrMin.minusYears(2));
        System.out.println("减四个月 = " + nowPlusOrMin.minusMonths(4));
        System.out.println("减22天 = " + nowPlusOrMin.minusDays(22));
        System.out.println("减1个星期 = " + nowPlusOrMin.minusWeeks(1));
        System.out.println("============================");

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第4张图片

2.5 LocalDate 对象的大小比较

 *  5.日期对象的比较
 *      date01.isEqual(date02) : 两个日期是否相等
 *      date01.isAfter(date02) : date01 是否 比 date02 晚
 *      date01.isBefore(date02) : date01 是否 比 date02 早
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
    
       // 5.日期对象比较大小
        LocalDate date01 = LocalDate.now();
        LocalDate date02 = LocalDate.of(2022, 3, 21);
        System.out.println("date01 = " + date01);
        System.out.println("date02 = " + date02);
        System.out.println("两天是否一致 : " + date01.isEqual(date02));
        System.out.println("date01是否比date02晚 : " + date01.isAfter(date02));
        System.out.println("date01是否比date02早 : " + date01.isBefore(date02));

        System.out.println("============================");

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第5张图片

2.6 LocalDate 的格式化为 字符串

 *  6.日期对象与字符串的转化
 *    6.1 日期对象转字符串 format() + DateTimeFormatter类
 *        String format01 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);    // 最常用 2022-03-22
 *        String format02 = localDate.format(DateTimeFormatter.ISO_DATE);          // 2022-03-23
 *        String format03 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);    // 20220323
 *        String format04 = localDate.format(DateTimeFormatter.ISO_ORDINAL_DATE); // 2022-082 年分-当前日期是这一年的第几天
 *        String format05 = localDate.format(DateTimeFormatter.ISO_WEEK_DATE);    // 2022-W12-3 年分-第几周-星期几
 *        String format06 = localDate.format(DateTimeFormatter.ofPattern("yyyy--$--MM--$--dd")); // 自定义格式化
 *
 *
 *    6.2 字符串转日期对象 parse()
 *        LocalDate dateParse01 = LocalDate.parse("2022--$--03--$--23",DateTimeFormatter.ofPattern("yyyy--$--MM--$--dd"));
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
    
        // 6.1 日期对象 格式化 为字符串
        LocalDate dateFormat01 = LocalDate.now();
        System.out.println("dateFormat01 = " + dateFormat01);

        String format01 = dateFormat01.format(DateTimeFormatter.ISO_LOCAL_DATE); // 最常用 2022-03-22
        System.out.println("format01(ISO_LOCAL_DATE) = " + format01);

        String format02 = dateFormat01.format(DateTimeFormatter.ISO_DATE); // 2022-03-23
        System.out.println("format02(ISO_DATE) = " + format02);

        String format03 = dateFormat01.format(DateTimeFormatter.BASIC_ISO_DATE); // 20220323
        System.out.println("format03(BASIC_ISO_DATE) = " + format03);

        String format04 = dateFormat01.format(DateTimeFormatter.ISO_ORDINAL_DATE); // 2022-082 年分-当前日期是这一年的第几天
        System.out.println("format04(ISO_ORDINAL_DATE) = " + format04);

        String format05 = dateFormat01.format(DateTimeFormatter.ISO_WEEK_DATE); // 2022-W12-3 年分-第几周-星期几
        System.out.println("format05(ISO_WEEK_DATE) = " + format05);

        String format06 = dateFormat01.format(DateTimeFormatter.ofPattern("yyyy--$--MM--$--dd")); // 自定义格式化
        System.out.println("format06(ofPattern) = " + format06);

        System.out.println();

        //6.2 字符串 转 时间对象
        LocalDate dateParse01 = LocalDate.parse("2022--$--03--$--23",DateTimeFormatter.ofPattern("yyyy--$--MM--$--dd"));
        System.out.println("dateParse01 = " + dateParse01);

        System.out.println("============================");


    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第6张图片

2.7 计算两个LocalDate 对象的日期差

 *  7.计算两个日期的差  Period
 *    Period between = Period.between(datePeriod01, datePeriod02); // 小一点的日期,大一点的日期,否则会出现负数
 *    7.1 获取相差的【年月日】整体的一个效果
 *        between.getYears()
 *        between.getMonths()
 *        between.getDays()
 *    7.2 分别获取相差的【年】【月】【日】的数据
 *        ChronoUnit.YEARS.between(datePeriod01, datePeriod02));
 *        ChronoUnit.MONTHS.between(datePeriod01, datePeriod02));
 *        ChronoUnit.DAYS.between(datePeriod01, datePeriod02));
 *

代码

package com.northcastle.K_Date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class LocalDateTest {
    public static void main(String[] args) {
    
        //7.计算两个日期对象之间的差
        LocalDate datePeriod01 = LocalDate.of(2022,1,27);
        System.out.println("datePeriod01 = " + datePeriod01);
        LocalDate datePeriod02 = LocalDate.of(2022,3,22);
        System.out.println("datePeriod02 = " + datePeriod02);

        Period between = Period.between(datePeriod01, datePeriod02); // 小一点的日期,大一点的日期

        System.out.println("between.getYears() = " + between.getYears());
        System.out.println("between.getMonths() = " + between.getMonths());
        System.out.println("between.getDays() = " + between.getDays());


        System.out.println("相差年数 = " + ChronoUnit.YEARS.between(datePeriod01, datePeriod02)); // 获取每个维度的数据
        System.out.println("相差月数 = " + ChronoUnit.MONTHS.between(datePeriod01, datePeriod02));
        System.out.println("相差天数 = " + ChronoUnit.DAYS.between(datePeriod01, datePeriod02));

        System.out.println("============================");

    }
}

执行结果

Java8新特性 - LocalDate 日期类的基本使用_第7张图片

2.8 其他方法

 *    其他方法
 *      isLeapYear() : 判断是否是闰年
 *      atStartOfDay() : 自动赋值 时分秒 为0
 *      lengthOfMonth() : 返回当前月份的长度
 *      lengthOfYear() : 返回今年有多少天
 *

其他的这些简单API 各位Coder 可以自行 测试,不在此赘述了,

3.完成

Congratulations!
You are one step closer to success!

你可能感兴趣的:(JAVA基础篇,java,java8,LocalDate,日期大小比较,求日期之间的差)