java中LocalDate使用总结

前言

在我们的日常开发中,很多业务场景都离不开时间的计算,比如定时任务:每天0点生成数据,或者每个月的一月份删除数据等。因此,我总结了java8中常用的时间API—LocalDate,需要的时候进行翻阅,以此来提高我们的开发效率。

LocalDate

LocalDate是一个线程安全的类,它是用final修饰的,主要是对日期进行操作。

获取当前日期

    //打印结果2022-04-10
    	LocalDate localDate = LocalDate.now();

LocalDate的now()方法直接返回2022-04-10(当前日期),我们可以直接将返回的结果转成String类型,然后进行修改,改成我们想要的时间类型(这里只是举一个例子,也可以通过格式化的方式来转换时间类型),比如我想去掉中间的连接符:

		LocalDate localDate = LocalDate.now();
		String now = String.valueOf(localDate);
		//打印结果为20220410
		String afterNow = now.replaceAll("-", "");

读取日期的值

简单读取

LocalDate的now方法可以获取今日的日期,它的of()方法也可以根据传入的参数来进行转换。并且LocalData支持读取日期的指定内容:

		//打印结果为2022-04-10
        LocalDate today = LocalDate.of(2022, 4, 10);
        //————————————————————————对年的操作————————————————————————————
        //获取今年的年份,打印结果为2022
        int year = today.getYear();
        //判断今年是否为闰年,2022年不是闰年,打印结果为false
        boolean leapYear = today.isLeapYear();
        //获取今年有多少天,打印结果为365
        int lengthOfYear= today.lengthOfYear();

        //————————————————————————对月的操作—————————————————————————————
        //获取本月份名称,打印结果为APRIL
        Month month = today.getMonth();
        //获取今年是第几个月,打印结果为4
        int monthValue = month.getValue();
        //获取今天是本月的第几天,打印结果为10
        int dayOfMonth = today.getDayOfMonth();
        //获取本月有多少天,打印结果为30
        int lengthOfMonth = today.lengthOfMonth();

        //————————————————————————对周的操作——————————————————————————————
        //获取本周的日期,打印结果为SUNDAY
        DayOfWeek dayOfWeek = today.getDayOfWeek();
        //获取本周第几天,打印结果为7
        int value = dayOfWeek.getValue();

        //————————————————————————对天的操作——————————————————————————————
        //获取今年的第几天,今天是2022年第100天,打印结果为100
        int dayOfYear = today.getDayOfYear();

通过get方法来获取

上面是一种读取的方式,其实还可以通过get()方法来进行读取,效果和上面是一样的,可以了解一下。
get方法源码:

  public int get(TemporalField field) {
        if (field instanceof ChronoField) {
            return get0(field);
        }
        return ChronoLocalDate.super.get(field);
    }

get方法里面的参数是一个TemporalField类型接口,它的下面有一个枚举ChronoField
在这里插入图片描述
这里面有很多方便我们使用的枚举,比如获取年月日的demo:

        LocalDate today = LocalDate.of(2022, 4, 10);

        int year = today.get(ChronoField.YEAR);
        int month = today.get(ChronoField.MONTH_OF_YEAR);
        int day = today.get(ChronoField.DAY_OF_MONTH);

但是,通过查看源码可知,get方法只支持几个类型的枚举,不然会报错误,如图所示:
1、get源码的get0()方法
在这里插入图片描述
2、查看get0()方法的源码
在这里插入图片描述

操作、解析日期

with方法

通过上面的方法我们可以来获取日期,但是有些情况下我们需要调整日期的时间,这时候我们可以使用with方法来进行灵活的调整。
with的使用和上面的get()方法十分的类似,下面给出几个简单的demo:

        //打印结果为2022-04-10
        LocalDate today = LocalDate.of(2022, 4, 10);
        //获取2034年的4月10日
        LocalDate localDate = today.withYear(2034);
        //获取2034年的4月10日的第二种写法
        LocalDate localDate1 = today.with(ChronoField.YEAR, 2034);
        //获取本周周一,打印结果为2022-04-04
        LocalDate monday = today.with(DayOfWeek.MONDAY);
        //其它方法请查看源码···············
        

除此之外,我们还可以使用TemporalAdjusters这个工具类来完成我们的需求

        //打印结果为2022-04-10
        LocalDate today = LocalDate.of(2022, 4, 10);

        //本月最后一天,打印结果为2022-04-30
        LocalDate with = today.with(TemporalAdjusters.lastDayOfMonth());
        //本年第一天,打印结果为2022-01-01
        LocalDate with1 = today.with(TemporalAdjusters.firstDayOfYear());

下面给出一些常用的api

方法名描述
dayofWeekInMonth创建一个新的日期,值为同一个月中每一周的第几天
firstDayOfMonth创建一个新的日期,值为本月的第一天
firstDayOfNextMonth创建一个新的日期,值为下月的第一天
firstDayOfNextYear创建一个新的日期,值为明年的第一天
firstDayOfYear创建一个新的日期,值为本年的第一天
firstInMonth创建一个新的日期,值为在本月中,第一个符合星期几的值
lastDayOfMonth创建一个新的日期,值为本月的最后一天
lastDayOfNextMonth创建一个新的日期,值为下个月的最后一天
lastDayOfNextYear创建一个新的日期,值为明年的最后一天
lastDayOfYear创建一个新的日期,值为本年的最后一天
lastInMonth创建一个新的日期,值为本月中,最后一个符合星期几的值
next/privious创建一个新的日期,并将其设定位第一个符合调整后符合星期几的值

plus,minus方法

这两个方法十分的好用,可以灵活的增加、减少年月日的时间,比较常用的场景是在指定时间使定时job生效。使用demo如下:

        //打印结果为2022-04-10
        LocalDate today = LocalDate.of(2022, 4, 10);

        //十年之后,打印结果为2032-04-10
        LocalDate localDate = today.plusYears(10);
        //一天之前,打印结果为2022-04-09
        LocalDate localDate1 = today.minusDays(1);
        //一个月之后,打印结果为2022-05-10
        LocalDate localDate2 = today.plusMonths(1);

格式化日期

有的时候,时间的格式不符合我们的预期,这是可以通过格式化来将日期转化成我们想要的类型

        //打印结果为2022-04-10
        LocalDate today = LocalDate.of(2022, 4, 10);
        //指定格式类型
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        //打印结果为 20220410
        String format = today.format(dateTimeFormatter);

LocalTime、LocalDateTime

LocalDate表示的是日期,LocalTime表示的是时间,LocalDateTime表示的更具体一些,是日期加时间,用法和上面的LocalDate十分的相似,不做过多的讲解了。

        //年月日时分秒
        LocalDateTime now = LocalDateTime.now();

        //时分秒
        LocalTime now1 = LocalTime.now();
  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值