LocalDate的API操作

本文深入探讨了Java 8中引入的LocalDate类的API,包括创建日期、获取日期部分、比较日期和日期操作等核心功能,并通过实例展示了如何在实际编程中有效利用这些API。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.akaiqi.chun.time;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;

import static java.time.temporal.ChronoField.DAY_OF_MONTH;
import static java.time.temporal.ChronoUnit.DAYS;

/**
 * 日期:年-月-日
 *
 * @author akaiqi
 * @date 2019/11/1 15:18
 */
public class LocalDateTest {


    /**
     * 通过静态工厂方法of创建一个LocalDate实例
     * 然后获取这个时间年,月,日,一年的第几天,星期几等
     */
    private static void test1() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date); //2019-11-01
        int year = date.getYear();
        Month month = date.getMonth();
        System.out.println(month); //NOVEMBER
        System.out.println(month.getValue());//11
        int day = date.getDayOfMonth();
        System.out.println(day);//1
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        System.out.println(dayOfWeek);//FRIDAY
        int len = date.lengthOfMonth();
        System.out.println(len);//(这个月有)30
        boolean leap = date.isLeapYear();
        System.out.println(leap);//false(闰年?)
    }

    /**
     * 从系统时钟中获取当前的日期,
     * 使用TemporalField读取LocalDate的值,使用get()方法获取
     * TemporalField是一个最终的、不可变的、线程安全的枚举。
     */
    private static void test2() {
        LocalDate today = LocalDate.now();
        System.out.println(today);
        int year = today.get(ChronoField.YEAR);
        int month = today.get(ChronoField.MONTH_OF_YEAR);
        int day = today.get(ChronoField.DAY_OF_MONTH);
        System.out.println(year + "年");//2019年
        System.out.println(month + "月");//11月
        System.out.println(day + "日");//1日
    }

    /**
     * compareTo:将此日期与另一个日期进行比较。比较器值为负,如果较小,则如果较大则为正
     * 一般都是LocalDate 类型比较,如果一些被比较的日期是不同的年表,那么年龄也被考虑,见ChronoLocalDate.compareTo(java.time.chrono.ChronoLocalDate)
     * <p>
     * equals(Object obj):如果这等于其他日期,则为真 obj=null返回false.源码实现:同一对象返回true,是LocalDate实例,则分别按年-月-日取比较
     * hashCode:日期的哈希码,同一时间的哈希值一样
     */
    private static void test3() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2019, 11, 2);
        LocalDate date3 = LocalDate.of(2020, 11, 1);
        LocalDate date4 = LocalDate.of(2019, 11, 1);
        System.out.println(date1.compareTo(date2));//-1
        System.out.println(date1.compareTo(date3));//-1
        System.out.println(date3.compareTo(date2));//1

        System.out.println(date1.equals(date4));//true
        System.out.println(date1.equals(date2));//false

        System.out.println(date1.hashCode());//4135617 同一时间的哈希值一样
        System.out.println(date4.hashCode());//4135617
    }

    /**
     * format(DateTimeFormatter formatter):日期格式化
     */
    private static void test4() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        String dateStr1 = date.format(DateTimeFormatter.ofPattern("yyyy MM dd"));
        System.out.println(dateStr1); //2019 11 01
        String dateStr2 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
        System.out.println(dateStr2);//2019年11月01日
        String dateStr3 = date.format(DateTimeFormatter.ofPattern("yyyy年MM月"));
        System.out.println(dateStr3);//2019年11月
    }

    /**
     * lengthOfMonth:这个月有多少天
     * lengthOfYear:今年有多少天
     */
    private static void test5() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.lengthOfMonth());//30
        System.out.println(date.lengthOfYear());//365
    }

    /**
     * minusMonths(long monthsToSubtract):减去monthsToSubtract个月后的日期
     * minusDays(long daysToSubtract):减去daysToSubtract日后的日期
     * minusMonths(long monthsToSubtract) :返回此 LocalDate一个副本,其中指定的周期以周为单位减去
     * minusYears(long yearsToSubtract) :返回此 LocalDate的副本,以减去的年份为单位
     * <p>
     * minus(long amountToSubtract, TemporalUnit unit) :返回此日期的副本,减去指定的单位。unit时间单位
     */
    private static void test6() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.minusMonths(1));//2019-10-01
        System.out.println(date.minusDays(1));//2019-10-31
        System.out.println(date.minusWeeks(1));//2019-10-25
        System.out.println(date.minusYears(1));//2018-11-01

        System.out.println(date.minus(1, DAYS));//2019-10-31
        //同理,还有其他单位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS
    }

    /**
     * plus(long amountToAdd, TemporalUnit unit) :返回此日期的副本,并添加指定的时间单位
     * plusDays(long daysToAdd) :日增加
     * plusMonths(long monthsToAdd):月增加
     * plusWeeks(long weeksToAdd):星期增加
     * plusYears(long yearsToAdd):年增加
     */
    private static void test7() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.plus(1, DAYS));//2019-11-02
        //同理,还有其他单位,常用:HOURS ,MINUTES ,SECONDS ,WEEKS MONTHS YEARS,
    }

    /**
     * query(TemporalQuery<R> query):获取某个字段的范围
     * range(TemporalField field)
     * <p>
     * toEpochDay():将此日期转换为大纪元日。
     * <p>
     * toString():输入日期(字符串类型)
     */
    private static void test8() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.range(ChronoField.DAY_OF_MONTH));//这个月的范围:1 - 30

        System.out.println(date.toEpochDay()); //18201
    }

    /**
     * until:计算两个LocalDate对象之间的时间量,单个TemporalUnit
     * <p>
     * until(Temporal endExclusive,TemporalUnit unit):两个日期之间的相差多少,可转换单位:DAYS,MONTHS(TemporalUnit)等
     * 等价于TemporalUnit.between(Temporal, Temporal)
     */
    private static void test9() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2019, 12, 1);
        System.out.println(date1.until(date2));//P1M
        System.out.println(date1.until(date2, DAYS));//30
        //方法二
        System.out.println(DAYS.between(date1, date2));//30
    }

    /**
     * with(TemporalField field,long newValue):按指定单位修改日期
     * <p>
     * withYear(int year):修改年份
     * withMonth(int month):修改月份
     * withDayOfMonth(int dayOfMonth):修改日
     * <p>
     * withDayOfYear
     */
    private static void test10() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        LocalDate date2 = date.with(DAY_OF_MONTH, 2);//2019-11-02  年月不变,修改日期
        System.out.println(date2);

        LocalDate date3 = date.withYear(2020);
        System.out.println(date3);//2020-11-01

        LocalDate date4 = date.withMonth(12);
        System.out.println(date4);//2019-12-01

        LocalDate date5 = date.withDayOfMonth(30);
        System.out.println(date5);//2019-11-30
    }


    /**
     * adjustInto:调整指定的时间对象与此对象的日期相同。
     * 等价于使用Temporal.with(TemporalField, long)通过ChronoField.EPOCH_DAY作为字段
     */
    private static void test11() {
        LocalDate date1 = LocalDate.of(2019, 11, 1);
        LocalDate date2 = LocalDate.of(2020, 1, 1);
        Temporal temporal = date1.adjustInto(date2);
        System.out.println(temporal);//2019-11-01
        System.out.println(temporal.with(date2));//2020-01-01

    }

    /**
     * 获取LocalDateTime:年与日时分秒
     * atStartOfDay():在此日期开始之前的午夜00:00时时间
     * atTime(int hour, int minute, int second):结合此日期与时间创建一个 LocalDateTime 。
     * atTime(int hour, int minute)
     * atTime(int hour, int minute, int second, int nanoOfSecond)
     * atTime(LocalTime time) :LocalTime时分秒
     */
    private static void test12() {
        LocalDate date = LocalDate.of(2019, 11, 1);
        System.out.println(date.atStartOfDay());//2019-11-01T00:00
        LocalDateTime time = date.atTime(12, 0, 0);
        System.out.println(time);//2019-11-01T12:00

        LocalTime localTime = LocalTime.of(1, 1, 1);
        System.out.println(localTime);//01:01:01
        LocalDateTime localDateTime = date.atTime(localTime);
        System.out.println(localDateTime);//2019-11-01T01:01:01
    }


    public static void main(String[] args) {
        test12();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值