LocalDate类是JDK自带的java.time包一个表示日期的时间类,用于进行日期的比较、运算等非常方便,这里介绍一些简单的使用方法

1、创建LocalDate类

1
2
3
4
5
6
// 今天的日期
LocalDate today = LocalDate.now();
// 使用年月日创建
LocalDate localDate = LocalDate.of(2024, 1, 1);
// 使用字符串创建
LocalDate parseLocalDate = LocalDate.parse("2024-01-01");

2、Date和LocalDate的相互转化

Date转化为LocalDate

1
2
3
// Date转化为LocalDate
Date todayDate = new Date();
LocalDate todayLocalDate = todayDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

LocalDate转化为Date

1
2
3
// LocalDate转化为Date
LocalDate todayLocalDate = LocalDate.now();
Date todayDate = Date.from(todayLocalDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

注:LocalDate转化为Date后,对应的Date的时分秒都是0,因为LocalDate只有日期

3、日期比较

1
2
3
4
5
6
7
8
LocalDate localDate1 = LocalDate.of(2024, 1, 1);
LocalDate localDate2 = LocalDate.of(2024, 1, 2);
// 日期1是否在日期2之前
boolean before = localDate1.isBefore(localDate2);
// 日期1是否于日期2相同
boolean equal = localDate1.isEqual(localDate2);
// 日期1是否在日期2之后
boolean after = localDate1.isAfter(localDate2);

4、增加日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LocalDate localDate = LocalDate.of(2024, 1, 1);
// 增加1天后的日期
LocalDate plusDays = localDate.plusDays(1);
// 增加1周后的日期
LocalDate plusWeeks = localDate.plusWeeks(1);
// 增加1个月后的日期
LocalDate plusMonths = localDate.plusMonths(1);
// 增加1年后的日期
LocalDate plusYears = localDate.plusYears(1);

// 增加2年3个月5天后的日期
Period periodToAdd = Period.ofYears(2).plusMonths(3).plusDays(5);
LocalDate plus = localDate.plus(periodToAdd);

// 增加2个星期后的日期
LocalDate plus1 = localDate.plus(2, ChronoUnit.WEEKS);

减少日期只需要把数字改为负数即可

PeriodChronoUnitDurationDayOfWeek等都是java.time包的,常用的类之一

5、获取指定条件的日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LocalDate localDate = LocalDate.of(2024, 1, 1);

// 获取某日期对应年份的第一天和最后一天的日期
LocalDate firstDayOfYear = localDate.with(TemporalAdjusters.firstDayOfYear());
LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());

// 获取某日期对应年月的第一天和最后一天的日期
LocalDate firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth());
LocalDate lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());

// 获取某日期对应年月的第一个周一和最后一个周一的日期
LocalDate firstMondayInMonth = localDate.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
LocalDate lastMondayInMonth = localDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));

// 获取某日期所在周的周一和周日的日期
LocalDate monday = localDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
LocalDate sunday = localDate.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));

6、获取日期的相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
LocalDate localDate = LocalDate.of(2024, 2, 1);

// 获取日期在该星期的第几天(周1算第一天)
int dayOfWeek = localDate.getDayOfWeek().getValue();
// 获取日期在该月的第几天
int dayOfMonth = localDate.getDayOfMonth();
// 获取日期在该年的第几天
int dayOfYear = localDate.getDayOfYear();
// 获取日期的月份在该年的第几月
int monthValue = localDate.getMonthValue();

// 获取日期所在的周,所以该年的第几周(以第一个周一在该年份算第一周)
int i = localDate.get(WeekFields.of(DayOfWeek.MONDAY, 7).weekOfYear());