前言
在我们的日常开发中,很多业务场景都离不开时间的计算,比如定时任务:每天0点生成数据,或者每个月的一月份删除数据等。因此,我总结了java8中常用的时间API—LocalDate,需要的时候进行翻阅,以此来提高我们的开发效率。
文章目录
LocalDate
LocalDate是一个线程安全的类,它是用final修饰的,主要是对日期进行操作。
获取当前日期
//打印结果2022-04-10
LocalDate localDate = LocalDate.now();
- 1
- 2
LocalDate的now()方法直接返回2022-04-10(当前日期),我们可以直接将返回的结果转成String类型,然后进行修改,改成我们想要的时间类型(这里只是举一个例子,也可以通过格式化的方式来转换时间类型),比如我想去掉中间的连接符:
LocalDate localDate = LocalDate.now();
String now = String.valueOf(localDate);
//打印结果为20220410
String afterNow = now.replaceAll("-", "");
- 1
- 2
- 3
- 4
读取日期的值
简单读取
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();
<span class="token comment">//————————————————————————对月的操作—————————————————————————————</span> <span class="token comment">//获取本月份名称,打印结果为APRIL</span> <span class="token class-name">Month</span> month <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">getMonth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取今年是第几个月,打印结果为4</span> <span class="token keyword">int</span> monthValue <span class="token operator">=</span> month<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取今天是本月的第几天,打印结果为10</span> <span class="token keyword">int</span> dayOfMonth <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">getDayOfMonth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取本月有多少天,打印结果为30</span> <span class="token keyword">int</span> lengthOfMonth <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">lengthOfMonth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//————————————————————————对周的操作——————————————————————————————</span> <span class="token comment">//获取本周的日期,打印结果为SUNDAY</span> <span class="token class-name">DayOfWeek</span> dayOfWeek <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">getDayOfWeek</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取本周第几天,打印结果为7</span> <span class="token keyword">int</span> value <span class="token operator">=</span> dayOfWeek<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//————————————————————————对天的操作——————————————————————————————</span> <span class="token comment">//获取今年的第几天,今天是2022年第100天,打印结果为100</span> <span class="token keyword">int</span> dayOfYear <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">getDayOfYear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
通过get方法来获取
上面是一种读取的方式,其实还可以通过get()方法来进行读取,效果和上面是一样的,可以了解一下。
get方法源码:
public int get(TemporalField field) {
if (field instanceof ChronoField) {
return get0(field);
}
return ChronoLocalDate.super.get(field);
}
- 1
- 2
- 3
- 4
- 5
- 6
get方法里面的参数是一个TemporalField类型接口,它的下面有一个枚举ChronoField
这里面有很多方便我们使用的枚举,比如获取年月日的demo:
LocalDate today = LocalDate.of(2022, 4, 10);
<span class="token keyword">int</span> year <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">ChronoField</span><span class="token punctuation">.</span>YEAR<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> month <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">ChronoField</span><span class="token punctuation">.</span>MONTH_OF_YEAR<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> day <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token class-name">ChronoField</span><span class="token punctuation">.</span>DAY_OF_MONTH<span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
但是,通过查看源码可知,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);
//其它方法请查看源码···············
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
除此之外,我们还可以使用TemporalAdjusters这个工具类来完成我们的需求
//打印结果为2022-04-10 LocalDate today = LocalDate.of(2022, 4, 10);
<span class="token comment">//本月最后一天,打印结果为2022-04-30</span> <span class="token class-name">LocalDate</span> <span class="token keyword">with</span> <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token keyword">with</span><span class="token punctuation">(</span><span class="token class-name">TemporalAdjusters</span><span class="token punctuation">.</span><span class="token function">lastDayOfMonth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//本年第一天,打印结果为2022-01-01</span> <span class="token class-name">LocalDate</span> with1 <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token keyword">with</span><span class="token punctuation">(</span><span class="token class-name">TemporalAdjusters</span><span class="token punctuation">.</span><span class="token function">firstDayOfYear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
下面给出一些常用的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);
<span class="token comment">//十年之后,打印结果为2032-04-10</span> <span class="token class-name">LocalDate</span> localDate <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">plusYears</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一天之前,打印结果为2022-04-09</span> <span class="token class-name">LocalDate</span> localDate1 <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">minusDays</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一个月之后,打印结果为2022-05-10</span> <span class="token class-name">LocalDate</span> localDate2 <span class="token operator">=</span> today<span class="token punctuation">.</span><span class="token function">plusMonths</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
格式化日期
有的时候,时间的格式不符合我们的预期,这是可以通过格式化来将日期转化成我们想要的类型
//打印结果为2022-04-10
LocalDate today = LocalDate.of(2022, 4, 10);
//指定格式类型
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
//打印结果为 20220410
String format = today.format(dateTimeFormatter);
- 1
- 2
- 3
- 4
- 5
- 6
LocalTime、LocalDateTime
LocalDate表示的是日期,LocalTime表示的是时间,LocalDateTime表示的更具体一些,是日期加时间,用法和上面的LocalDate十分的相似,不做过多的讲解了。
//年月日时分秒 LocalDateTime now = LocalDateTime.now();
<span class="token comment">//时分秒</span> <span class="token class-name">LocalTime</span> now1 <span class="token operator">=</span> <span class="token class-name">LocalTime</span><span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
- 1
- 2
- 3
- 4
- 5