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

x33g5p2x  于2021-12-18 转载在 其他  
字(28.3k)|赞(0)|评价(0)|浏览(6410)

用途:日期计算

使用场景

包含日期的各种计算方式

项目引用

此博文的依据: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<br>(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit)判断两个日期相差的时长,只保留绝对值
cn.hutool.core.date.DateUtil.between<br>(java.util.Date, java.util.Date, cn.hutool.core.date.DateUnit, boolean)判断两个日期相差的时长
cn.hutool.core.date.DateUtil.betweenMs<br>(java.util.Date, java.util.Date)判断两个日期相差的毫秒数
cn.hutool.core.date.DateUtil.betweenDay<br>(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
cn.hutool.core.date.DateUtil.betweenWeek<br>(java.util.Date, java.util.Date, boolean)计算指定指定时间区间内的周数
cn.hutool.core.date.DateUtil.betweenMonth<br>(java.util.Date, java.util.Date, boolean)计算两个日期相差月数 <br> 在非重置情况下,如果起始日期的天大于结束日期的天,月数要少算1(不足1个月)
cn.hutool.core.date.DateUtil.betweenYear<br>(java.util.Date, java.util.Date, boolean)计算两个日期相差年数 <br> 在非重置情况下,如果起始日期的月大于结束日期的月,年数要少算1(不足1年)
cn.hutool.core.date.DateUtil.formatBetween<br>(java.util.Date, java.util.Date, cn.hutool.core.date.BetweenFormatter.Level)格式化日期间隔输出
cn.hutool.core.date.DateUtil.formatBetween<br>(java.util.Date, java.util.Date)格式化日期间隔输出,精确到毫秒
cn.hutool.core.date.DateUtil.formatBetween<br>(long, cn.hutool.core.date.BetweenFormatter.Level)格式化日期间隔输出
cn.hutool.core.date.DateUtil.formatBetween<br>(long)格式化日期间隔输出,精确到毫秒
cn.hutool.core.date.DateUtil.isIn<br>(java.util.Date, java.util.Date, java.util.Date)当前日期是否在日期指定范围内 <br> 起始日期和结束日期可以互换
cn.hutool.core.date.DateUtil.isSameTime<br>(java.util.Date, java.util.Date)是否为相同时间 <br> 此方法比较两个日期的时间戳是否相同
cn.hutool.core.date.DateUtil.isSameDay<br>(java.util.Date, java.util.Date)比较两个日期是否为同一天
cn.hutool.core.date.DateUtil.isSameMonth<br>(java.util.Date, java.util.Date)比较两个日期是否为同一月
cn.hutool.core.date.DateUtil.spendNt<br>(long)计时,常用于记录某段代码的执行时间,单位:纳秒
cn.hutool.core.date.DateUtil.spendMs<br>(long)计时,常用于记录某段代码的执行时间,单位:毫秒
cn.hutool.core.date.DateUtil.toIntSecond<br>(java.util.Date)格式化成yyMMddHHmm后转换为int型
cn.hutool.core.date.DateUtil.timer()计时器 <br> 计算某个过程花费的时间,精确到毫秒
cn.hutool.core.date.DateUtil.timer<br>(boolean)计时器 <br> 计算某个过程花费的时间,精确到毫秒
cn.hutool.core.date.DateUtil.createStopWatch()创建秒表{@link StopWatch},用于对代码块的执行时间计数<br><br>使用方法如下:<br><br>StopWatch stopWatch = DateUtil.createStopWatch();<br>// 任务1 stopWatch.start(“任务一”); Thread.sleep(1000); stopWatch.stop();<br>// 任务2 stopWatch.start(“任务一”); Thread.sleep(2000); stopWatch.stop(); <br>// 打印出耗时 Console.log(stopWatch.prettyPrint());
cn.hutool.core.date.DateUtil.createStopWatch<br>(java.lang.String)创建秒表{@link StopWatch},用于对代码块的执行时间计数<br><br>使用方法如下:<br><br>StopWatch stopWatch = DateUtil.createStopWatch(“任务名称”);<br>// 任务1 stopWatch.start(“任务一”); Thread.sleep(1000); stopWatch.stop(); <br>// 任务2 stopWatch.start(“任务一”); Thread.sleep(2000); stopWatch.stop();<br>// 打印出耗时 Console.log(stopWatch.prettyPrint());
cn.hutool.core.date.DateUtil.ageOfNow<br>(java.lang.String)生日转为年龄,计算法定年龄
cn.hutool.core.date.DateUtil.ageOfNow<br>(java.util.Date)生日转为年龄,计算法定年龄
cn.hutool.core.date.DateUtil.isLeapYear<br>(int)是否闰年
cn.hutool.core.date.DateUtil.age<br>(java.util.Date, java.util.Date)计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
cn.hutool.core.date.DateUtil.timeToSecond<br>(java.lang.String)HH:mm:ss 时间格式字符串转为秒数 <br> 参考:https://github.com/iceroot
cn.hutool.core.date.DateUtil.secondToTime<br>(int)秒数转为时间格式(HH:mm:ss) <br> 参考:https://github.com/iceroot
cn.hutool.core.date.DateUtil.range<br>(java.util.Date, java.util.Date, cn.hutool.core.date.DateField)创建日期范围生成器
cn.hutool.core.date.DateUtil.rangeToList<br>(java.util.Date, java.util.Date, cn.hutool.core.date.DateField)创建日期范围生成器
cn.hutool.core.date.DateUtil.getZodiac<br>(int, int)通过生日计算星座
cn.hutool.core.date.DateUtil.getChineseZodiac<br>(int)计算生肖,只计算1900年后出生的人
cn.hutool.core.date.DateUtil.compare<br>(java.util.Date, java.util.Date){@code null}安全的日期比较,{@code null}对象排在末尾
cn.hutool.core.date.DateUtil.compare<br>(java.util.Date, java.util.Date, java.lang.String){@code null}安全的日期比较,并只比较指定格式; <br> {@code null}对象排在末尾, 并指定日期格式;
cn.hutool.core.date.DateUtil.nanosToMillis<br>(long)纳秒转毫秒
cn.hutool.core.date.DateUtil.nanosToSeconds<br>(long)纳秒转秒,保留小数
cn.hutool.core.date.DateUtil.toInstant<br>(java.util.Date)Date对象转换为{@link Instant}对象
cn.hutool.core.date.DateUtil.toInstant<br>(java.time.temporal.TemporalAccessor)Date对象转换为{@link Instant}对象
cn.hutool.core.date.DateUtil.toLocalDateTime<br>(java.time.Instant){@link Instant} 转换为 {@link LocalDateTime},使用系统默认时区
cn.hutool.core.date.DateUtil.toLocalDateTime<br>(java.util.Date){@link Date} 转换为 {@link LocalDateTime},使用系统默认时区
cn.hutool.core.date.DateUtil.lengthOfYear<br>(int)获得指定年份的总天数
cn.hutool.core.date.DateUtil.lengthOfMonth<br>(int, boolean)获得指定月份的总天数

方法明细

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

方法描述

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

支持版本及以上

参数描述:

参数名描述
Date beginDatebeginDate 起始日期
Date endDateendDate 结束日期
DateUnit unitunit 相差的单位:相差 天{@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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期
DateUnit unitunit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
boolean isAbsisAbs 日期间隔是否只保留绝对值正数

返回值:

日期差

参考案例:

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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期

返回值:

日期差

参考案例:

//判断两个日期相差的毫秒数
		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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期
boolean isResetisReset 是否重置时间为起始时间

返回值:

日期差

参考案例:

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);
			System.out.println("datr("+datr+") 和\"1970-01-01\" 相关天数:"+betweenDay);
			Assert.assertEquals(Math.abs(LocalDate.parse(datr).toEpochDay()), betweenDay);
		}

返回的是相差天数的绝对值

源码解析:

链接:待补充

方法明细

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

方法描述

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

支持版本及以上

参数描述:

参数名描述
Date beginDatebeginDate 开始时间
Date endDateendDate 结束时间
boolean isResetisReset 是否重置时间为起始时间

返回值:

周数

参考案例:

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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期
boolean isResetisReset 是否重置时间为起始时间(重置天时分秒)

返回值:

相差月数

参考案例:

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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期
boolean isResetisReset 是否重置时间为起始时间(重置月天时分秒)

返回值:

相差年数

参考案例:

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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期
BetweenFormatter.Level levellevel 级别,按照天、小时、分、秒、毫秒分为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 beginDatebeginDate 起始日期
Date endDateendDate 结束日期

返回值:

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 betweenMsbetweenMs 日期间隔
BetweenFormatter.Level levellevel 级别,按照天、小时、分、秒、毫秒分为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 betweenMsbetweenMs 日期间隔

返回值:

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(date1, date2, DateUnit.MS);
		String formatBetween = DateUtil.formatBetween(between);
		Assert.assertEquals("31天1小时21分50秒901毫秒", formatBetween);

源码解析:

链接:待补充

方法明细

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

方法描述

当前日期是否在日期指定范围内<br>
起始日期和结束日期可以互换

支持版本及以上

3.0.8

参数描述:

参数名描述
Date datedate 被检查的日期
Date beginDatebeginDate 起始日期
Date endDateendDate 结束日期

返回值:

是否在范围内

参考案例:

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

		String dateStr2 = "2017-04-01 23:56:14.001";
		Date date2 = DateUtil.parse(dateStr2);
		boolean isIn = DateUtil.isIn(date,date1,date2);
		Assert.assertEquals(Boolean.TRUE, isIn);
		dateStr = "2017-05-01 22:34:23.100";
		 date = DateUtil.parse(dateStr);
		 isIn = DateUtil.isIn(date,date1,date2);
		Assert.assertEquals(Boolean.FALSE, isIn);

源码解析:

链接:待补充

方法明细

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

方法描述

是否为相同时间<br>
此方法比较两个日期的时间戳是否相同

支持版本及以上

4.1.13

参数描述:

参数名描述
Date date1date1 日期1
Date date2date2 日期2

返回值:

是否为相同时间

参考案例:

String dateStr = "2017-02-01 22:34:23.100";
		Date date = DateUtil.parse(dateStr);
		String dateStr1 = "2017-02-01 22:34:23.100";
		Date date1 = DateUtil.parse(dateStr1);
		boolean isSameTime = DateUtil.isSameTime(date,date1);
		Assert.assertEquals(Boolean.TRUE, isSameTime);
		dateStr1 = "2017-02-01 22:34:23.110";
		date1 = DateUtil.parse(dateStr1);
		isSameTime = DateUtil.isSameTime(date,date1);
		Assert.assertEquals(Boolean.FALSE, isSameTime);

源码解析:

链接:待补充

方法明细

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

方法描述

比较两个日期是否为同一天

支持版本及以上

4.1.13

参数描述:

参数名描述
Date date1date1 日期1
Date date2date2 日期2

返回值:

是否为同一天

参考案例:

String dateStr1 = "2021-05-19 22:34:23.100";
		Date date1 = DateUtil.parse(dateStr1);
		String dateStr2 = "2021-05-19 23:56:14.001";
		Date date2 = DateUtil.parse(dateStr2);
		boolean isSameDay = DateUtil.isSameDay(date1,date2);
		Assert.assertEquals(Boolean.TRUE, isSameDay);
		 dateStr2 = "2021-05-20 23:56:14.001";
		 date2 = DateUtil.parse(dateStr2);
		 isSameDay = DateUtil.isSameDay(date1,date2);
		Assert.assertEquals(Boolean.FALSE, isSameDay);

源码解析:

链接:待补充

方法明细

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

方法描述

比较两个日期是否为同一月

支持版本及以上

5.4.1

参数描述:

参数名描述
Date date1date1 日期1
Date date2date2 日期2

返回值:

是否为同一月

参考案例:

String dateStr1 = "2021-05-19 22:34:23.100";
		Date date1 = DateUtil.parse(dateStr1);
		String dateStr2 = "2021-05-31 23:56:14.001";
		Date date2 = DateUtil.parse(dateStr2);
		boolean isSameMonth = DateUtil.isSameMonth(date1,date2);
		Assert.assertEquals(Boolean.TRUE, isSameMonth);
		dateStr2 = "2021-06-20 23:56:14.001";
		date2 = DateUtil.parse(dateStr2);
		isSameMonth = DateUtil.isSameMonth(date1,date2);
		Assert.assertEquals(Boolean.FALSE, isSameMonth);

源码解析:

链接:待补充

方法明细

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

方法描述

计时,常用于记录某段代码的执行时间,单位:纳秒

支持版本及以上

参数描述:

参数名描述
long preTimepreTime 之前记录的时间

返回值:

时间差,纳秒

参考案例:

//计时,常用于记录某段代码的执行时间,单位:纳秒
		int j= 0;
		long nanoTimeStart = System.nanoTime();
		for (int i = 0; i < 100000; i++) {
			 j=j+i;
		}
		long nanoTimeEnd = DateUtil.spendNt(nanoTimeStart);
		System.out.println("运行时间为:"+nanoTimeEnd+"纳秒");
		System.out.println("j的值为:"+j);

源码解析:

链接:待补充

方法明细

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

方法描述

计时,常用于记录某段代码的执行时间,单位:毫秒

支持版本及以上

参数描述:

参数名描述
long preTimepreTime 之前记录的时间

返回值:

时间差,毫秒

参考案例:

//计时,常用于记录某段代码的执行时间,单位:毫秒
		int j= 0;
		long start = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			j=j+i;
		}
		long end = DateUtil.spendMs(start);
		System.out.println("运行时间为:"+end+"毫秒");
		System.out.println("j的值为:"+j);

源码解析:

同样的一段for循环代码,使用spendMs和spendNt得到的时间,换算成相同的单位,差距很大
后面在源码篇,会专门来解读
链接:待补充

方法明细

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

方法描述

格式化成yyMMddHHmm后转换为int型

支持版本及以上

参数描述:

参数名描述
Date datedate 日期

返回值:

int

参考案例:

//格式化成yyMMddHHmm后转换为int型
		String dateStr1 = "2021-05-19 22:34:23";
		Date date = DateUtil.parse(dateStr1);
		int toIntSecond = DateUtil.toIntSecond(date);
		System.out.println(toIntSecond);
		Assert.assertEquals(2105192234, toIntSecond);

源码解析:

链接:待补充

方法明细

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

方法描述

计时器<br>
计算某个过程花费的时间,精确到毫秒

支持版本及以上

参数描述:

参数名描述

返回值:

Timer

参考案例:

TimeInterval timer = DateUtil.timer();

		// ---------------------------------
		// -------这是执行过程
		// ---------------------------------

		timer.interval();// 花费毫秒数
		timer.intervalRestart();// 返回花费时间,并重置开始时间
		timer.intervalMinute();// 花费分钟数

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.timer(boolean)

方法描述

计时器<br>
计算某个过程花费的时间,精确到毫秒

支持版本及以上

5.2.3

参数描述:

参数名描述
boolean isNanoisNano 是否使用纳秒计数,false则使用毫秒

返回值:

Timer

参考案例:

TimeInterval timer = DateUtil.timer(false);

		// ---------------------------------
		// -------这是执行过程
		// ---------------------------------

		timer.interval();// 花费毫秒数
		timer.intervalRestart();// 返回花费时间,并重置开始时间
		timer.intervalMinute();// 花费分钟数

源码解析:

链接:待补充

方法明细

方法名称: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());

支持版本及以上

5.2.3

参数描述:

参数名描述

返回值:

{@link StopWatch}

参考案例:

StopWatch stopWatch = DateUtil.createStopWatch();
		 // 任务1
		 stopWatch.start("任务一");
		Thread.sleep(1000);
		stopWatch.stop();
		 // 任务2
		 stopWatch.start("任务二");
		 Thread.sleep(2000);
		 stopWatch.stop();
		 // 打印出耗时
		System.out.println(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());

支持版本及以上

5.2.3

参数描述:

参数名描述
String idid 用于标识秒表的唯一ID

返回值:

{@link StopWatch}

参考案例:

StopWatch stopWatch = DateUtil.createStopWatch("任务名称");
		// 任务1
		stopWatch.start("任务一");
		Thread.sleep(1000);
		stopWatch.stop();
		// 任务2
		stopWatch.start("任务二");
		Thread.sleep(2000);
		stopWatch.stop();
		// 打印出耗时
		System.out.println(stopWatch.prettyPrint());

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.ageOfNow(java.lang.String)

方法描述

生日转为年龄,计算法定年龄

支持版本及以上

参数描述:

参数名描述
String birthDaybirthDay 生日,标准日期字符串

返回值:

年龄

参考案例:

String birthDay = "2019-05-19";
		//生日转为年龄,计算法定年龄(生日,标准日期字符串)
		int ageOfNow = DateUtil.ageOfNow(birthDay);
		System.out.println(ageOfNow);

源码解析:

链接:待补充

方法明细

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

方法描述

生日转为年龄,计算法定年龄

支持版本及以上

参数描述:

参数名描述
Date birthDaybirthDay 生日

返回值:

年龄

参考案例:

String birthDay = "2019-05-19";
		//生日转为年龄,计算法定年龄(生日,标准日期字符串)
		Date birthDate = DateUtil.parse(birthDay);
		int ageOfNow = DateUtil.ageOfNow(birthDate);
		System.out.println(ageOfNow);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.isLeapYear(int)

方法描述

是否闰年

支持版本及以上

参数描述:

参数名描述
int yearyear 年

返回值:

是否闰年

参考案例:

Assert.assertEquals(true, DateUtil.isLeapYear(2020));
		Assert.assertEquals(false, DateUtil.isLeapYear(2021));

源码解析:

链接:待补充

方法明细

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

方法描述

计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄

支持版本及以上

参数描述:

参数名描述
Date birthdaybirthday 生日
Date dateToComparedateToCompare 需要对比的日期

返回值:

年龄

参考案例:

String d1 = "2000-02-29";
		String d2 = "2018-02-28";
		final int age = DateUtil.age(DateUtil.parseDate(d1), DateUtil.parseDate(d2));
		Assert.assertEquals(18, age);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.timeToSecond(java.lang.String)

方法描述

HH:mm:ss 时间格式字符串转为秒数<br>
参考:https://github.com/iceroot

支持版本及以上

3.1.2

参数描述:

参数名描述
String timeStrtimeStr 字符串时分秒(HH:mm:ss)格式

返回值:

时分秒转换后的秒数

参考案例:

int second = DateUtil.timeToSecond("00:01:40");
		Assert.assertEquals(100, second);
		second = DateUtil.timeToSecond("00:00:40");
		Assert.assertEquals(40, second);
		second = DateUtil.timeToSecond("01:00:00");
		Assert.assertEquals(3600, second);
		second = DateUtil.timeToSecond("00:00:00");
		Assert.assertEquals(0, second);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.secondToTime(int)

方法描述

秒数转为时间格式(HH:mm:ss)<br>
参考:https://github.com/iceroot

支持版本及以上

3.1.2

参数描述:

参数名描述
int secondsseconds 需要转换的秒数

返回值:

转换后的字符串

参考案例:

String time = DateUtil.secondToTime(3600);
		Assert.assertEquals("01:00:00", time);
		time = DateUtil.secondToTime(3800);
		Assert.assertEquals("01:03:20", time);
		time = DateUtil.secondToTime(0);
		Assert.assertEquals("00:00:00", time);
		time = DateUtil.secondToTime(30);
		Assert.assertEquals("00:00:30", time);

源码解析:

链接:待补充

方法明细

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

方法描述

创建日期范围生成器

支持版本及以上

参数描述:

参数名描述
Date startstart 起始日期时间
Date endend 结束日期时间
DateField unitunit 步进单位

返回值:

{@link DateRange}

参考案例:

DateTime start = DateUtil.parse("2017-01-01");
		DateTime end = DateUtil.parse("2017-01-03");

		// 测试包含开始和结束情况下步进为1的情况
		DateRange range = DateUtil.range(start, end, DateField.DAY_OF_YEAR);
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-01"));
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-02"));
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-03"));
		try {
			range.next();
			Assert.fail("已超过边界,下一个元素不应该存在!");
		} catch (NoSuchElementException ignored) {
		}

		// 测试多步进的情况
		range = new DateRange(start, end, DateField.DAY_OF_YEAR, 2);
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-01"));
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-03"));

		// 测试不包含开始结束时间的情况
		range = new DateRange(start, end, DateField.DAY_OF_YEAR, 1, false, false);
		Assert.assertEquals(range.next(), DateUtil.parse("2017-01-02"));
		try {
			range.next();
			Assert.fail("不包含结束时间情况下,下一个元素不应该存在!");
		} catch (NoSuchElementException ignored) {
		}

源码解析:

链接:待补充

方法明细

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

方法描述

创建日期范围生成器

支持版本及以上

参数描述:

参数名描述
Date startstart 起始日期时间
Date endend 结束日期时间
DateField unitunit 步进单位

返回值:

{@link DateRange}

参考案例:

DateTime start = DateUtil.parse("2017-01-01");
		DateTime end = DateUtil.parse("2017-01-31");

		List<DateTime> rangeToList = DateUtil.rangeToList(start, end, DateField.DAY_OF_YEAR);
		Assert.assertEquals(rangeToList.get(0), DateUtil.parse("2017-01-01"));
		Assert.assertEquals(rangeToList.get(1), DateUtil.parse("2017-01-02"));

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.getZodiac(int, int)

方法描述

通过生日计算星座

支持版本及以上

4.4.3

参数描述:

参数名描述
int monthmonth 月,从0开始计数
int dayday 天

返回值:

星座名

参考案例:

//month从0开始计数
		Assert.assertEquals("射手座", DateUtil.getZodiac(11,21));

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.getChineseZodiac(int)

方法描述

计算生肖,只计算1900年后出生的人

支持版本及以上

4.4.3

参数描述:

参数名描述
int yearyear 农历年

返回值:

生肖名

参考案例:

//month从0开始计数
		Assert.assertEquals("马", DateUtil.getChineseZodiac(1990));

源码解析:

链接:待补充

方法明细

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

方法描述

{@code null}安全的日期比较,{@code null}对象排在末尾

支持版本及以上

4.6.2

参数描述:

参数名描述
Date date1date1 日期1
Date date2date2 日期2

返回值:

比较结果,如果date1 < date2,返回数小于0,date1==date2返回0,date1 > date2 大于0

参考案例:

Date date1 = DateUtil.parse("2021-04-13 23:59:59.999");
		Date date2 = DateUtil.parse("2021-04-13 23:59:10");

		Assert.assertEquals(1, DateUtil.compare(date1, date2));

源码解析:

链接:待补充

方法明细

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

方法描述

{@code null}安全的日期比较,并只比较指定格式; {@code null}对象排在末尾, 并指定日期格式;

支持版本及以上

5.6.4

参数描述:

参数名描述
Date date1date1 日期1
Date date2date2 日期2
String formatformat 日期格式,常用格式见: {@link DatePattern}; 允许为空; date1 date2; eg: yyyy-MM-dd

返回值:

比较结果,如果date1 < date2,返回数小于0,date1==date2返回0,date1 > date2 大于0

参考案例:

Date date1 = DateUtil.parse("2021-04-13 23:59:59.999");
		Date date2 = DateUtil.parse("2021-04-13 23:59:10");
		Assert.assertEquals(1, DateUtil.compare(date1, date2, DatePattern.NORM_DATETIME_PATTERN));
		Assert.assertEquals(0, DateUtil.compare(date1, date2, DatePattern.NORM_DATE_PATTERN));
		Assert.assertEquals(0, DateUtil.compare(date1, date2, DatePattern.NORM_DATETIME_MINUTE_PATTERN));
		Date date11 = DateUtil.parse("2021-04-13 23:59:59.999");
		Date date22 = DateUtil.parse("2021-04-11 23:10:10");
		Assert.assertEquals(0, DateUtil.compare(date11, date22, DatePattern.NORM_MONTH_PATTERN));

源码解析:

链接:待补充

方法明细

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

方法描述

纳秒转毫秒

支持版本及以上

4.6.6

参数描述:

参数名描述
long durationduration 时长

返回值:

时长毫秒

参考案例:

//纳秒转毫秒
		Assert.assertEquals(1000,DateUtil.nanosToMillis(1000*1000*1000));

源码解析:

链接:待补充

方法明细

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

方法描述

纳秒转秒,保留小数

支持版本及以上

4.6.6

参数描述:

参数名描述
long durationduration 时长

返回值:

参考案例:

DateUtil.nanosToSeconds(1000*1000*1000)

源码解析:

链接:待补充

方法明细

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

方法描述

Date对象转换为{@link Instant}对象

支持版本及以上

5.0.2

参数描述:

参数名描述
Date datedate Date对象

返回值:

{@link Instant}对象

参考案例:

LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
		Instant instant = DateUtil.toInstant(localDateTime);
		Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString());

		LocalDate localDate = localDateTime.toLocalDate();
		instant = DateUtil.toInstant(localDate);
		Assert.assertNotNull(instant);

		LocalTime localTime = localDateTime.toLocalTime();
		instant = DateUtil.toInstant(localTime);
		Assert.assertNotNull(instant);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.toInstant(java.time.temporal.TemporalAccessor)

方法描述

Date对象转换为{@link Instant}对象

支持版本及以上

5.0.2

参数描述:

参数名描述
TemporalAccessor temporalAccessortemporalAccessor Date对象

返回值:

{@link Instant}对象

参考案例:

LocalDateTime localDateTime = LocalDateTime.parse("2017-05-06T08:30:00", DateTimeFormatter.ISO_DATE_TIME);
		Instant instant = DateUtil.toInstant(localDateTime);
		Assert.assertEquals("2017-05-06T00:30:00Z", instant.toString());

		LocalDate localDate = localDateTime.toLocalDate();
		instant = DateUtil.toInstant(localDate);
		Assert.assertNotNull(instant);

		LocalTime localTime = localDateTime.toLocalTime();
		instant = DateUtil.toInstant(localTime);
		Assert.assertNotNull(instant);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.toLocalDateTime(java.time.Instant)

方法描述

{@link Instant} 转换为 {@link LocalDateTime},使用系统默认时区

支持版本及以上

5.0.5

参数描述:

参数名描述
Instant instantinstant {@link Instant}

返回值:

{@link LocalDateTime}

参考案例:

Date src = new Date();
		
		LocalDateTime ldt = Convert.toLocalDateTime(src);
		Assert.assertEquals(ldt, DateUtil.toLocalDateTime(src));
		
		Timestamp ts = Timestamp.from(src.toInstant());
		ldt = Convert.toLocalDateTime(ts);
		Assert.assertEquals(ldt, DateUtil.toLocalDateTime(src));
		
		String str = "2020-12-12 12:12:12.0";
		ldt = Convert.toLocalDateTime(str);
		Assert.assertEquals(ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")), str);

源码解析:

链接:待补充

方法明细

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

方法描述

{@link Date} 转换为 {@link LocalDateTime},使用系统默认时区

支持版本及以上

5.0.5

参数描述:

参数名描述
Date datedate {@link Date}

返回值:

{@link LocalDateTime}

参考案例:

Date src = new Date();
		
		LocalDateTime ldt = Convert.toLocalDateTime(src);
		Assert.assertEquals(ldt, DateUtil.toLocalDateTime(src));
		
		Timestamp ts = Timestamp.from(src.toInstant());
		ldt = Convert.toLocalDateTime(ts);
		Assert.assertEquals(ldt, DateUtil.toLocalDateTime(src));
		
		String str = "2020-12-12 12:12:12.0";
		ldt = Convert.toLocalDateTime(str);
		Assert.assertEquals(ldt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")), str);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.lengthOfYear(int)

方法描述

获得指定年份的总天数

支持版本及以上

5.3.6

参数描述:

参数名描述
int yearyear 年份

返回值:

参考案例:

int dayOfYear = DateUtil.dayOfYear(DateUtil.parse("2020-01-01"));
		Assert.assertEquals(1, dayOfYear);
		int lengthOfYear = DateUtil.lengthOfYear(2020);
		Assert.assertEquals(366, lengthOfYear);

源码解析:

链接:待补充

方法明细

方法名称:cn.hutool.core.date.DateUtil.lengthOfMonth(int, boolean)

方法描述

获得指定月份的总天数

支持版本及以上

5.4.2

参数描述:

参数名描述
int monthmonth 月份
boolean isLeapYearisLeapYear 是否闰年

返回值:

参考案例:

int lengthOfMonth = DateUtil.lengthOfMonth(2,true);
		Assert.assertEquals(29, lengthOfMonth);
		lengthOfMonth = DateUtil.lengthOfMonth(2,false);
		Assert.assertEquals(28, lengthOfMonth);

源码解析:

链接:待补充

相关文章