7hutool实战:DateUtil(时间工具类)-日期计算

Posted 小虚竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7hutool实战:DateUtil(时间工具类)-日期计算相关的知识,希望对你有一定的参考价值。

技术活,该赏
关注+一键三连(点赞,评论,收藏)再看,养成好习惯

hutool实战(带你掌握里面的各种工具)目录


用途:日期计算

使用场景

包含日期的各种计算方式

项目引用

此博文的依据:hutool-5.6.5版本源码

        <dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-core</artifactId>
			<version>5.6.5</version>
		</dependency>

方法摘要

方法描述
cn.hutool.core.date.DateUtil.between
(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit)
判断两个日期相差的时长,只保留绝对值
cn.hutool.core.date.DateUtil.between
(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit, boolean)
判断两个日期相差的时长
cn.hutool.core.date.DateUtil.betweenMs
(java.util.Date, java.util.Date)
判断两个日期相差的毫秒数
cn.hutool.core.date.DateUtil.betweenDay
(java.util.Date, java.util.Date, boolean)
判断两个日期相差的天数
 有时候我们计算相差天数的时候需要忽略时分秒。 
比如:2016-02-01 23:59:59和2016-02-02 00:00:00相差一秒
如果isReset为{@code false}相差天数为0。
如果isReset为{@code true}相差天数将被计算为1
cn.hutool.core.date.DateUtil.betweenWeek
(java.util.Date, java.util.Date, boolean)
计算指定指定时间区间内的周数
cn.hutool.core.date.DateUtil.betweenMonth
(java.util.Date, java.util.Date, boolean)
计算两个日期相差月数
在非重置情况下,如果起始日期的天大于结束日期的天,月数要少算1(不足1个月)
cn.hutool.core.date.DateUtil.betweenYear
(java.util.Date, java.util.Date, boolean)
计算两个日期相差年数
在非重置情况下,如果起始日期的月大于结束日期的月,年数要少算1(不足1年)
cn.hutool.core.date.DateUtil.formatBetween
(java.util.Date, java.util.Date, cn.hutool.core.date.BetweenFormatter.Level)
格式化日期间隔输出
cn.hutool.core.date.DateUtil.formatBetween
(java.util.Date, java.util.Date)
格式化日期间隔输出,精确到毫秒
cn.hutool.core.date.DateUtil.formatBetween
(long, cn.hutool.core.date.BetweenFormatter.Level)
格式化日期间隔输出
cn.hutool.core.date.DateUtil.formatBetween
(long)
格式化日期间隔输出,精确到毫秒
cn.hutool.core.date.DateUtil.isIn
(java.util.Date, java.util.Date, java.util.Date)
当前日期是否在日期指定范围内
起始日期和结束日期可以互换
cn.hutool.core.date.DateUtil.isSameTime
(java.util.Date, java.util.Date)
是否为相同时间
此方法比较两个日期的时间戳是否相同
cn.hutool.core.date.DateUtil.isSameDay
(java.util.Date, java.util.Date)
比较两个日期是否为同一天
cn.hutool.core.date.DateUtil.isSameMonth
(java.util.Date, java.util.Date)
比较两个日期是否为同一月
cn.hutool.core.date.DateUtil.spendNt
(long)
计时,常用于记录某段代码的执行时间,单位:纳秒
cn.hutool.core.date.DateUtil.spendMs
(long)
计时,常用于记录某段代码的执行时间,单位:毫秒
cn.hutool.core.date.DateUtil.toIntSecond
(java.util.Date)
格式化成yyMMddHHmm后转换为int型
cn.hutool.core.date.DateUtil.timer()
计时器
计算某个过程花费的时间,精确到毫秒
cn.hutool.core.date.DateUtil.timer
(boolean)
计时器
计算某个过程花费的时间,精确到毫秒
cn.hutool.core.date.DateUtil.createStopWatch()
创建秒表{@link StopWatch},用于对代码块的执行时间计数

使用方法如下:

 StopWatch stopWatch = DateUtil.createStopWatch(); 
// 任务1 stopWatch.start(“任务一”); Thread.sleep(1000); stopWatch.stop();
// 任务2 stopWatch.start(“任务一”); Thread.sleep(2000); stopWatch.stop();
// 打印出耗时 Console.log(stopWatch.prettyPrint());

cn.hutool.core.date.DateUtil.createStopWatch
(java.lang.String)
创建秒表{@link StopWatch},用于对代码块的执行时间计数

使用方法如下:

 StopWatch stopWatch = DateUtil.createStopWatch(“任务名称”);
// 任务1 stopWatch.start(“任务一”); Thread.sleep(1000); stopWatch.stop();
// 任务2 stopWatch.start(“任务一”); Thread.sleep(2000); stopWatch.stop();
// 打印出耗时 Console.log(stopWatch.prettyPrint());

cn.hutool.core.date.DateUtil.ageOfNow
(java.lang.String)
生日转为年龄,计算法定年龄
cn.hutool.core.date.DateUtil.ageOfNow
(java.util.Date)
生日转为年龄,计算法定年龄
cn.hutool.core.date.DateUtil.isLeapYear
(int)
是否闰年
cn.hutool.core.date.DateUtil.age
(java.util.Date, java.util.Date)
计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
cn.hutool.core.date.DateUtil.timeToSecond
(java.lang.String)
HH:mm:ss 时间格式字符串转为秒数
参考:https://github.com/iceroot
cn.hutool.core.date.DateUtil.secondToTime
(int)
秒数转为时间格式(HH:mm:ss)
参考:https://github.com/iceroot
cn.hutool.core.date.DateUtil.range
(java.util.Date, java.util.Date, cn.hutool.core.date.DateField)
创建日期范围生成器
cn.hutool.core.date.DateUtil.rangeToList
(java.util.Date, java.util.Date, cn.hutool.core.date.DateField)
创建日期范围生成器
cn.hutool.core.date.DateUtil.getZodiac
(int, int)
通过生日计算星座
cn.hutool.core.date.DateUtil.getChineseZodiac
(int)
计算生肖,只计算1900年后出生的人
cn.hutool.core.date.DateUtil.compare
(java.util.Date, java.util.Date)
{@code null}安全的日期比较,{@code null}对象排在末尾
cn.hutool.core.date.DateUtil.compare
(java.util.Date, java.util.Date, java.lang.String)
{@code null}安全的日期比较,并只比较指定格式;
{@code null}对象排在末尾, 并指定日期格式;
cn.hutool.core.date.DateUtil.nanosToMillis
(long)
纳秒转毫秒
cn.hutool.core.date.DateUtil.nanosToSeconds
(long)
纳秒转秒,保留小数
cn.hutool.core.date.DateUtil.toInstant
(java.util.Date)
Date对象转换为{@link Instant}对象
cn.hutool.core.date.DateUtil.toInstant
(java.time.temporal.TemporalAccessor)
Date对象转换为{@link Instant}对象
cn.hutool.core.date.DateUtil.toLocalDateTime
(java.time.Instant)
{@link Instant} 转换为 {@link LocalDateTime},使用系统默认时区
cn.hutool.core.date.DateUtil.toLocalDateTime
(java.util.Date)
{@link Date} 转换为 {@link LocalDateTime},使用系统默认时区
cn.hutool.core.date.DateUtil.lengthOfYear
(int)
获得指定年份的总天数
cn.hutool.core.date.DateUtil.lengthOfMonth
(int, boolean)
获得指定月份的总天数

方法明细

方法名称:cn.hutool.core.date.DateUtil.between(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit)

方法描述

判断两个日期相差的时长,只保留绝对值

支持版本及以上

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
DateUnit unit
unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等

返回值:

日期差

参考案例:

        String dateStr1 = "2017-03-01 22:34:23";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14";
		Date date2 = DateUtil.parse(dateStr2);

		// 相差月
		long betweenMonth = DateUtil.betweenMonth(date1, date2, false);
		Assert.assertEquals(1, betweenMonth);// 相差一个月
		// 反向
		betweenMonth = DateUtil.betweenMonth(date2, date1, false);
		Assert.assertEquals(1, betweenMonth);// 相差一个月

		// 相差天
		long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
		Assert.assertEquals(31, betweenDay);// 相差一个月,31天
		// 反向
		betweenDay = DateUtil.between(date2, date1, DateUnit.DAY);
		Assert.assertEquals(31, betweenDay);// 相差一个月,31天

		// 相差小时
		long betweenHour = DateUtil.between(date1, date2, DateUnit.HOUR);
		Assert.assertEquals(745, betweenHour);
		// 反向
		betweenHour = DateUtil.between(date2, date1, DateUnit.HOUR);
		Assert.assertEquals(745, betweenHour);

		// 相差分
		long betweenMinute = DateUtil.between(date1, date2, DateUnit.MINUTE);
		Assert.assertEquals(44721, betweenMinute);
		// 反向
		betweenMinute = DateUtil.between(date2, date1, DateUnit.MINUTE);
		Assert.assertEquals(44721, betweenMinute);

		// 相差秒
		long betweenSecond = DateUtil.between(date1, date2, DateUnit.SECOND);
		Assert.assertEquals(2683311, betweenSecond);
		// 反向
		betweenSecond = DateUtil.between(date2, date1, DateUnit.SECOND);
		Assert.assertEquals(2683311, betweenSecond);

		// 相差秒
		long betweenMS = DateUtil.between(date1, date2, DateUnit.MS);
		Assert.assertEquals(2683311000L, betweenMS);
		// 反向
		betweenMS = DateUtil.between(date2, date1, DateUnit.MS);
		Assert.assertEquals(2683311000L, betweenMS);
		long between = DateUtil.between(DateUtil.parse("2019-05-06 02:15:00"), DateUtil.parse("2019-05-06 02:20:00"), DateUnit.HOUR);
		Assert.assertEquals(0, between);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.between(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit, boolean)

方法描述

判断两个日期相差的时长

支持版本及以上

3.3.1

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
DateUnit unit
unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
boolean isAbs
isAbs 日期间隔是否只保留绝对值正数

返回值:

日期差

参考案例:

		long between = DateUtil.between(DateUtil.parse("2021-05-18 22:15:00"), DateUtil.parse("2021-05-18 21:15:00"), DateUnit.HOUR,true);
		Assert.assertEquals(1, between);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.betweenMs(java.util.Date, java.util.Date)

方法描述

判断两个日期相差的毫秒数

支持版本及以上

3.0.1

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期

返回值:

日期差

参考案例:

		//判断两个日期相差的毫秒数
		long between = DateUtil.betweenMs(DateUtil.parse("2021-05-18 22:15:00"), DateUtil.parse("2021-05-18 21:15:00"));
		Assert.assertEquals(60*60*1000, between);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.betweenDay(java.util.Date, java.util.Date, boolean)

方法描述

判断两个日期相差的天数<br>

 有时候我们计算相差天数的时候需要忽略时分秒。
 比如:2016-02-01 23:59:59和2016-02-02 00:00:00相差一秒
 如果isReset为{@code false}相差天数为0。
 如果isReset为{@code true}相差天数将被计算为1
 

支持版本及以上

3.0.1

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
boolean isReset
isReset 是否重置时间为起始时间

返回值:

日期差

参考案例:

		for (int i = 0; i < 1000; i++) {
			String datr = RandomUtil.randomInt(1900, 2099) + "-01-20";
			long betweenDay = DateUtil.betweenDay(
					DateUtil.parseDate("1970-01-01"),
					DateUtil.parseDate(datr), false);
			Assert.assertEquals(Math.abs(LocalDate.parse(datr).toEpochDay()), betweenDay);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.betweenWeek(java.util.Date, java.util.Date, boolean)

方法描述

计算指定指定时间区间内的周数

支持版本及以上

参数描述:

参数名描述
Date beginDate
beginDate 开始时间
Date endDate
endDate 结束时间
boolean isReset
isReset 是否重置时间为起始时间

返回值:

周数

参考案例:

		final DateTime start = DateUtil.parse("2019-03-05");
		final DateTime end = DateUtil.parse("2019-10-05");

		final long weekCount = DateUtil.betweenWeek(start, end, true);
		Assert.assertEquals(30L, weekCount);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.betweenMonth(java.util.Date, java.util.Date, boolean)

方法描述

计算两个日期相差月数<br>
在非重置情况下,如果起始日期的天大于结束日期的天,月数要少算1(不足1个月)

支持版本及以上

3.0.8

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
boolean isReset
isReset 是否重置时间为起始时间(重置天时分秒)

返回值:

相差月数

参考案例:

		String dateStr1 = "2017-03-01 22:34:23";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14";
		Date date2 = DateUtil.parse(dateStr2);

		// 相差月
		long betweenMonth = DateUtil.betweenMonth(date1, date2, false);
		Assert.assertEquals(1, betweenMonth);// 相差一个月

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.betweenYear(java.util.Date, java.util.Date, boolean)

方法描述

计算两个日期相差年数<br>
在非重置情况下,如果起始日期的月大于结束日期的月,年数要少算1(不足1年)

支持版本及以上

3.0.8

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
boolean isReset
isReset 是否重置时间为起始时间(重置月天时分秒)

返回值:

相差年数

参考案例:

		long betweenYear = DateUtil.betweenYear(DateUtil.parse("2021-05-18 22:15:00"), DateUtil.parse("2020-05-18 21:15:00"),true);
		Assert.assertEquals(1, betweenYear);

		betweenYear = DateUtil.betweenYear(DateUtil.parse("2020-05-18 22:15:00"), DateUtil.parse("2021-05-18 22:15:00"),true);
		Assert.assertEquals(1, betweenYear);

		betweenYear = DateUtil.betweenYear(DateUtil.parse("2020-05-18 22:15:00"), DateUtil.parse("2021-05-18 21:15:00"),false);
		Assert.assertEquals(0, betweenYear);

		betweenYear = DateUtil.betweenYear(DateUtil.parse("2020-05-18 22:15:00"), DateUtil.parse("2021-05-19 22:15:00"),false);
		Assert.assertEquals(1, betweenYear);

		betweenYear = DateUtil.betweenYear(DateUtil.parse("2020-05-18 22:15:00"), DateUtil.parse("2021-04-18 22:15:00"),false);
		Assert.assertEquals(0, betweenYear);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.formatBetween(java.util.Date, java.util.Date, cn.hutool.core.date.BetweenFormatter.Level)

方法描述

格式化日期间隔输出

支持版本及以上

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期
BetweenFormatter.Level level
level 级别,按照天、小时、分、秒、毫秒分为5个等级

返回值:

XX天XX小时XX分XX秒

参考案例:

        String dateStr1 = "2017-03-01 22:34:23";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14";
		Date date2 = DateUtil.parse(dateStr2);

		long between = DateUtil.between(date1, date2, DateUnit.MS);
		String formatBetween = DateUtil.formatBetween(between, Level.MINUTE);
		Assert.assertEquals("31天1小时21分", formatBetween);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.formatBetween(java.util.Date, java.util.Date)

方法描述

格式化日期间隔输出,精确到毫秒

支持版本及以上

3.0.1

参数描述:

参数名描述
Date beginDate
beginDate 起始日期
Date endDate
endDate 结束日期

返回值:

XX天XX小时XX分XX秒

参考案例:

		String dateStr1 = "2017-03-01 22:34:23.100";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14.001";
		Date date2 = DateUtil.parse(dateStr2);
		//格式化日期间隔输出,精确到毫秒
		String formatBetween = DateUtil.formatBetween(date1,date2);
		Assert.assertEquals("31天1小时21分50秒901毫秒", formatBetween);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.formatBetween(long, cn.hutool.core.date.BetweenFormatter.Level)

方法描述

格式化日期间隔输出

支持版本及以上

参数描述:

参数名描述
long betweenMs
betweenMs 日期间隔
BetweenFormatter.Level level
level 级别,按照天、小时、分、秒、毫秒分为5个等级

返回值:

XX天XX小时XX分XX秒XX毫秒

参考案例:

		String dateStr1 = "2017-03-01 22:34:23";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14";
		Date date2 = DateUtil.parse(dateStr2);

		long between = DateUtil.between(date1, date2, DateUnit.MS);
		String formatBetween = DateUtil.formatBetween(between, Level.MINUTE);
		Assert.assertEquals("31天1小时21分", formatBetween);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.formatBetween(long)

方法描述

格式化日期间隔输出,精确到毫秒

支持版本及以上

3.0.1

参数描述:

参数名描述
long betweenMs
betweenMs 日期间隔

返回值:

XX天XX小时XX分XX秒XX毫秒

参考案例:

		String dateStr1 = "2017-03-01 22:34:23.100";
		Date date1 = DateUtil.parse(dateStr1);

		String dateStr2 = "2017-04-01 23:56:14.001";
		Date date2 = DateUtil.parse(dateStr2);
		//格式化日期间隔输出,精确到毫秒
		long between = DateUtil.between(d

以上是关于7hutool实战:DateUtil(时间工具类)-日期计算的主要内容,如果未能解决你的问题,请参考以下文章

7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)

7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)

7hutool实战FileUtil 文件工具类(100多个文件常用操作方法)

1hutool实战:DateUtil(时间工具类)-当前时间

1hutool实战:DateUtil(时间工具类)-当前时间

6hutool实战:DateUtil(时间工具类)-时间偏移量获取