JAVA中的日期LocalDate类详细用法讲解

 更新时间:2024年01月29日 08:59:14   作者:加洛斯  
Java中存在一个日历表示法的类库,LocalDate类,如果只想要指定的年月日就可以用这个LocalDate类,下面这篇文章主要给大家介绍了关于JAVA中日期LocalDate类详细用法讲解的相关资料,需要的朋友可以参考下

前言

java.time.LocalDate是Java 8引入的日期类之一,位于java.time包中,它提供了一种简单的方式来表示日期,不包括时间和时区信息。下面我门来解释一下他的各种用法。

用法一:获取当前日期的一些信息:

LocalDate表示一个年份、月份和日期的日期,其一般形式为:yyyy-MM-dd。例如:2023-10-11。LocalDate在JAVA中由final修饰,是不可变的,一旦创建,就不能更改它的值。如果需要修改日期,可以创建一个新的LocalDate对象。

1.获取当前日期:可以使用LocalDate.now()来获取当前日期。

LocalDate currentDate = LocalDate.now();//创建一个LocalData对象获取当前日期
System.out.println("当前日期为:"+currentDate);

其输出结果为:

当前日期为:2023-10-11

2.除了获取整个日期以外,还可以获取当前的年份、月份、天等基础信息

// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取年份
int year = currentDate.getYear();
// 获取月份
Month month = currentDate.getMonth();
// 获取日
int day = currentDate.getDayOfMonth();
System.out.println("年份: " + year);
System.out.println("月份: " + month);
System.out.println("日: " + day);

其输出结果为:(如果想要获取以int形式的月份可以使用:int monthValue = currentDate.getMonthValue();)

年份: 2023
月份: OCTOBER
日: 11 

3.获取星期几,获取日期在年份中的第几天,获取日期所在月份的天数,获取日期所在年份的天数以及检查日期所在年份是否为闰年

LocalDate currentDate = LocalDate.now();
// 获取星期几枚举值
DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
// 获取日期在年份中的第几天
int dayOfYear = currentDate.getDayOfYear();
// 检查日期所在年份是否为闰年
boolean isLeapYear = currentDate.isLeapYear();
// 获取日期所在月份的天数
int daysInMonth = currentDate.lengthOfMonth();
// 获取日期所在年份的天数
int daysInYear = currentDate.lengthOfYear();
// 获取星期几的整数值
int dayOfWeekValue = currentDate.getDayOfWeek().getValue();
System.out.println("当前日期: " + currentDate);             //当前日期: 2023-10-11
System.out.println("今天是星期 " + dayOfWeekValue);         //今天是星期 3
System.out.println("星期几: " + dayOfWeek);                //星期几: WEDNESDAY
System.out.println("日期在年份中的第几天: " + dayOfYear);    //日期在年份中的第几天: 284
System.out.println("是否为闰年: " + isLeapYear);           //是否为闰年: false
System.out.println("当前月份的天数: " + daysInMonth);      //当前月份的天数: 31
System.out.println("当前年份的天数: " + daysInYear);       //当前年份的天数: 365

用法二:创建特定的日期: LocalDate.of、LocalDate.parse

可以使用LocalDate.of(year, month, day)来创建一个特定的日期对象

LocalDate currentDate1 = LocalDate.of(2023,10,22);
System.out.println("当前日期为:"+currentDate1);

其输出结果为:

当前日期为:2023-10-22

除了使用 LocalDate.of来创造一个特定的日期对象外,我们还可以将一个格式标准的String对象转化为LocalData对象:LocalDate.parse ,LocalDate.parse用于将字符串表示的日期解析为 LocalDate 对象。它允许你将字符串日期按照指定的日期格式转换为日期对象,以便后续操作或显示。

//创建一个字符串日期
String stringdata="2023-01-06";
//格式化日期规则
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//将字符串日期按照规则转化为LocalData对象
LocalDate stringcurrentDate1= LocalDate.parse(stringdata,formatter);
System.out.println("当前日期为:"+stringcurrentDate1);

其输出结果为:(需要注意的是:你规定的日期格式应为:yyyy-MM-dd,你不可以写2023-1-06,否则会抛出:java.time.format.DateTimeParseException:异常)

当前日期为:2023-01-06

 将字符串日期转化为LocalData对象的场景多用于读取文件中的日期,在做业务的时候经常会从Excel、Word或者图像识别的发票等等数据中读取到日期,有的时候这些日期可不会是规范的形式,那么该如何解决?假如说现在传递的日期就是:2023-1-6,我们怎么转化为LocalData对象呢?答案还是使用我们的DateTimeFormatter formatter,格式化日期,只需要将值设为yyyy-M-d即可读取,并且如果需要的话还可以补零。

// 原始日期字符串
String originalDate = "2023-1-1";
// 将日期字符串解析为 LocalDate 对象
LocalDate date = LocalDate.parse(originalDate, DateTimeFormatter.ofPattern("yyyy-M-d"));
System.out.println("格式化前的日期:" + originalDate);
// 使用 DateTimeFormatter 格式化日期,指定月份和日期部分的宽度为两位
String formattedDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println("格式化后的日期:" + formattedDate);

其输出结果为:

格式化前的日期:2023-1-1
格式化后的日期:2023-01-01

用法三:LocalDate的日期运算(增加或者减少指定年月日周)

1.plusYears(long years), minusYears(long years):增加或减少指定年数。

LocalDate date = LocalDate.now();
LocalDate futureDate = date.plusYears(2); // 增加2年
LocalDate pastDate = date.minusYears(1); // 减少1年
System.out.println("增加后的年数:"+futureDate);//增加后的年数:2025-10-11
System.out.println("减少后的年数:"+pastDate);//减少后的年数:2022-10-11

2.plusMonths(long months), minusMonths(long months):增加或减少指定月数。

3.plusWeeks(long weeks), minusWeeks(long weeks):增加或减少指定周数。

4.plusDays(long days), minusDays(long days):增加或减少指定天数。(函数形式一样,所以月周天不做代码展示了)

5.除了对年月周日单独操作外,我们还可以进行统一的操作,比如增加一年零三个月(plus为增,minus为减)

LocalDate date = LocalDate.now();
LocalDate futureDate = date.plus(Period.of(1, 2, 0)); // 增加1年3个月
System.out.println("当 前 日 期:"+date);       //当 前 日 期:2023-10-11
System.out.println("增加后的日期:"+futureDate);//增加后的日期:2024-12-11

用法四:获取当前时间所在周,月等信息的特定时间

1.获取当前时间所在周的第一天以及最后一天:

LocalDate currentDate = LocalDate.now();
// 获取当前周的第一天(星期一)
LocalDate firstDayOfWeek = currentDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
// 获取当前周的最后一天(星期日)
LocalDate lastDayOfWeek = currentDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
System.out.println("本周第一天: " + firstDayOfWeek); //本周第一天: 2023-10-09
System.out.println("本周最后一天: " + lastDayOfWeek);//本周最后一天: 2023-10-15

2.获取当前时间所在月的第一天以及最后一天:

// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取当前月的第一天
LocalDate firstDayOfMonth = currentDate.with(TemporalAdjusters.firstDayOfMonth());
// 获取当前月的最后一天
LocalDate lastDayOfMonth = currentDate.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("本月第一天: " + firstDayOfMonth); //本月第一天: 2023-10-01
System.out.println("本月最后一天: " + lastDayOfMonth);//本月最后一天: 2023-10-31

3.获取当前时间所在周是本年以及本月第几周

// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取 WeekFields 对象,指定周的起始日为星期一
//4 指定了星期四作为一年中的第一天。这影响了一年中的第一周是如何定义的。在这种定义下,一年中的第一周将包含星期四
// 因此星期四所在的周将被视为第一周,直到下一年的星期四。
WeekFields weekFields = WeekFields.of(DayOfWeek.MONDAY,4);
// 获取当前日期所在周是本月的第几周
int weekOfMonth = currentDate.get(weekFields.weekOfMonth());
// 获取当前日期所在周是本年的第几周
int weekOfYear = currentDate.get(weekFields.weekOfWeekBasedYear());
System.out.println("当前日期所在周是本月的第 " + weekOfMonth + " 周");
System.out.println("当前日期所在周是本年的第 " + weekOfYear + " 周");

 关于TemporalAdjusters的一些简介

TemporalAdjusters 是 Java 8 中的一个实用工具类,它提供了一些内置的、用于日期时间调整的工具方法。这些方法允许你进行复杂的日期时间调整操作,如获取某月的第一天、获取下一个星期一、获取年底最后一天等。TemporalAdjusters 中的方法返回 TemporalAdjuster 对象,这是一个函数式接口,用于在 java.time 框架中进行日期时间的调整。

以下是一些常见的 TemporalAdjusters 方法及其功能:

firstDayOfMonth():返回指定日期所在月份的第一天。

lastDayOfMonth():返回指定日期所在月份的最后一天。

firstDayOfNextMonth():返回指定日期下个月的第一天。

firstDayOfNextYear():返回指定日期下一年的第一天。

next(DayOfWeek dayOfWeek):返回指定日期之后的下一个星期几。例如,next(DayOfWeek.MONDAY) 返回下一个星期一。

previous(DayOfWeek dayOfWeek):返回指定日期之前的上一个星期几。

nextOrSame(DayOfWeek dayOfWeek):返回指定日期,如果它是指定星期几,则返回它本身,否则返回下一个指定星期几。

previousOrSame(DayOfWeek dayOfWeek):返回指定日期,如果它是指定星期几,则返回它本身,否则返回上一个指定星期几。

firstInMonth(DayOfWeek dayOfWeek):返回指定日期所在月份的第一个指定星期几。

lastInMonth(DayOfWeek dayOfWeek):返回指定日期所在月份的最后一个指定星期几。

dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek):返回指定日期所在月份的第 ordinal 个指定星期几。例如,dayOfWeekInMonth(2, DayOfWeek.WEDNESDAY) 返回指定日期所在月份的第二个星期三。

firstDayOfYear():返回指定日期所在年份的第一天。

lastDayOfYear():返回指定日期所在年份的最后一天。

用法五:日期的比较:

1. equals() 方法:

equals() 方法用于检查两个 LocalDate 对象是否表示相同的日期。如果两个对象表示相同的日期,equals() 方法将返回 true,否则返回 false。

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 5, 15);
LocalDate date3 = LocalDate.of(2023, 5, 16);
boolean areEqual  = date1.equals(date2); // 返回 true
boolean areEqual2 = date1.equals(date3); // 返回 false

2.isBefore() 方法:

isBefore() 方法用于检查一个 LocalDate 是否在另一个 LocalDate 之前。如果第一个日期在第二个日期之前,该方法返回 true,否则返回 false。

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 5, 20);
boolean isBefore  = date1.isBefore(date2); // 返回 true
boolean isBefore2 = date2.isBefore(date1); // 返回 false

3.isAfter() 方法:

isAfter() 方法用于检查一个 LocalDate 是否在另一个 LocalDate 之后。如果第一个日期在第二个日期之后,该方法返回 true,否则返回 false。

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 5, 10);
boolean isAfter = date1.isAfter(date2); // 返回 true

4.compareTo() 方法:

compareTo() 方法用于将两个 LocalDate 对象进行比较,并返回一个整数值。如果第一个日期在第二个日期之前,返回负数;如果两个日期相同,返回零;如果第一个日期在第二个日期之后,返回正数。

LocalDate date1 = LocalDate.of(2023, 5, 15);
LocalDate date2 = LocalDate.of(2023, 5, 20);
int result = date1.compareTo(date2); // 返回-5
int result2 = date2.compareTo(date1); // 返回5

附:Java中使用LocalDate根据日期来计算年龄的实现方法

示例1:根据出生日期和当前日期计算年龄

这个示例将展示如何使用LocalDate来计算一个人的年龄。假设当前日期是2021年7月31日,我们想计算一个人1995年10月24日出生时的年龄。下面是实现方法的代码,其中代码块中的“xxxx-xx-xx”部分需要替换成具体的年月日:

LocalDate birthDate = LocalDate.of(1995, Month.OCTOBER, 24);
LocalDate currentDate = LocalDate.now();

int age = Period.between(birthDate, currentDate).getYears();

System.out.println("Age: " + age);

输出结果为:

Age: 25

示例2:根据生日字符串来计算年龄

这个示例将展示如何使用LocalDate来计算一个人的年龄。假设当前日期是2021年7月31日,我们有一个包含生日的字符串“1995-10-24”,我们想计算这个人的年龄。下面是实现方法的代码:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate birthDate = LocalDate.parse("1995-10-24", formatter);
LocalDate currentDate = LocalDate.now();

int age = Period.between(birthDate, currentDate).getYears();

System.out.println("Age: " + age);

输出结果为:

Age: 25

总结 

到此这篇关于JAVA中日期LocalDate类详细用法讲解的文章就介绍到这了,更多相关JAVA日期LocalDate类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单了解Spring循环依赖解决过程

    简单了解Spring循环依赖解决过程

    这篇文章主要介绍了简单了解Spring循环依赖解决过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java中的PrintWriter 介绍_动力节点Java学院整理

    Java中的PrintWriter 介绍_动力节点Java学院整理

    PrintWriter 是字符类型的打印输出流,它继承于Writer。接下来通过本文给大家介绍java中的 PrintWriter 相关知识,感兴趣的朋友一起学习吧
    2017-05-05
  • 关于log4j漏洞修复解决方案及源码编译

    关于log4j漏洞修复解决方案及源码编译

    Log4j 是Apache为Java提供的日志管理工具。他与System.out.println()的作用相似,用来跟踪、调试、维护程序。这篇文章主要介绍了关于log4j漏洞修复解决方案及源码编译,需要的朋友可以参考下
    2021-12-12
  • 一篇文章带你了解Java SpringBoot Nacos

    一篇文章带你了解Java SpringBoot Nacos

    这篇文章主要介绍了SpringBoot使用Nacos配置中心的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-09-09
  • Spring源码解析 Bean属性填充

    Spring源码解析 Bean属性填充

    这篇文章主要介绍了Spring源码解析 Bean属性填充,文章围绕主题展开想详细的内容详情,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Java老矣 尚能饭否?

    Java老矣 尚能饭否?

    Java老矣,尚能饭否?各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
    2017-06-06
  • javaweb页面附件、图片下载及打开(实现方法)

    javaweb页面附件、图片下载及打开(实现方法)

    下面小编就为大家带来一篇javaweb页面附件、图片下载及打开(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot处理form-data表单接收对象数组的方法

    SpringBoot处理form-data表单接收对象数组的方法

    form-data则是一种更加灵活的编码方式,它可以处理二进制数据(如图片、文件等)以及文本数据,这篇文章主要介绍了SpringBoot处理form-data表单接收对象数组,需要的朋友可以参考下
    2023-11-11
  • java批量导入导出文件的实例分享(兼容xls,xlsx)

    java批量导入导出文件的实例分享(兼容xls,xlsx)

    这篇文章主要给大家介绍了利用java批量导入导出文件的相关资料,文中给出了详细的实例代码,并且兼容xls,xlsx,对大家具有一定的参考学习价值,下面跟着小编一起来看看详细的介绍吧。
    2017-06-06
  • Spring-data-redis操作redis cluster的示例代码

    Spring-data-redis操作redis cluster的示例代码

    这篇文章主要介绍了Spring-data-redis操作redis cluster的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10

最新评论