文章23 | 阅读 31818 | 点赞0
包含日期的各种计算方式
此博文的依据: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) | 获得指定月份的总天数 |
判断两个日期相差的时长,只保留绝对值
参数名 | 描述 |
---|---|
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);
链接:待补充
判断两个日期相差的时长
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);
链接:待补充
判断两个日期相差的毫秒数
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);
链接:待补充
判断两个日期相差的天数<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);
System.out.println("datr("+datr+") 和\"1970-01-01\" 相关天数:"+betweenDay);
Assert.assertEquals(Math.abs(LocalDate.parse(datr).toEpochDay()), betweenDay);
}
返回的是相差天数的绝对值
链接:待补充
计算指定指定时间区间内的周数
参数名 | 描述 |
---|---|
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);
链接:待补充
计算两个日期相差月数<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);// 相差一个月
链接:待补充
计算两个日期相差年数<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);
链接:待补充
格式化日期间隔输出
参数名 | 描述 |
---|---|
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);
链接:待补充
格式化日期间隔输出,精确到毫秒
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);
链接:待补充
格式化日期间隔输出
参数名 | 描述 |
---|---|
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);
链接:待补充
格式化日期间隔输出,精确到毫秒
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(date1, date2, DateUnit.MS);
String formatBetween = DateUtil.formatBetween(between);
Assert.assertEquals("31天1小时21分50秒901毫秒", formatBetween);
链接:待补充
当前日期是否在日期指定范围内<br>
起始日期和结束日期可以互换
3.0.8
参数名 | 描述 |
---|---|
Date date | date 被检查的日期 |
Date beginDate | beginDate 起始日期 |
Date endDate | endDate 结束日期 |
是否在范围内
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);
链接:待补充
是否为相同时间<br>
此方法比较两个日期的时间戳是否相同
4.1.13
参数名 | 描述 |
---|---|
Date date1 | date1 日期1 |
Date date2 | date2 日期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);
链接:待补充
比较两个日期是否为同一天
4.1.13
参数名 | 描述 |
---|---|
Date date1 | date1 日期1 |
Date date2 | date2 日期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);
链接:待补充
比较两个日期是否为同一月
5.4.1
参数名 | 描述 |
---|---|
Date date1 | date1 日期1 |
Date date2 | date2 日期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);
链接:待补充
计时,常用于记录某段代码的执行时间,单位:纳秒
参数名 | 描述 |
---|---|
long preTime | preTime 之前记录的时间 |
时间差,纳秒
//计时,常用于记录某段代码的执行时间,单位:纳秒
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);
链接:待补充
计时,常用于记录某段代码的执行时间,单位:毫秒
参数名 | 描述 |
---|---|
long preTime | preTime 之前记录的时间 |
时间差,毫秒
//计时,常用于记录某段代码的执行时间,单位:毫秒
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得到的时间,换算成相同的单位,差距很大
后面在源码篇,会专门来解读
链接:待补充
格式化成yyMMddHHmm后转换为int型
参数名 | 描述 |
---|---|
Date date | date 日期 |
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);
链接:待补充
计时器<br>
计算某个过程花费的时间,精确到毫秒
参数名 | 描述 |
---|
Timer
TimeInterval timer = DateUtil.timer();
// ---------------------------------
// -------这是执行过程
// ---------------------------------
timer.interval();// 花费毫秒数
timer.intervalRestart();// 返回花费时间,并重置开始时间
timer.intervalMinute();// 花费分钟数
链接:待补充
计时器<br>
计算某个过程花费的时间,精确到毫秒
5.2.3
参数名 | 描述 |
---|---|
boolean isNano | isNano 是否使用纳秒计数,false则使用毫秒 |
Timer
TimeInterval timer = DateUtil.timer(false);
// ---------------------------------
// -------这是执行过程
// ---------------------------------
timer.interval();// 花费毫秒数
timer.intervalRestart();// 返回花费时间,并重置开始时间
timer.intervalMinute();// 花费分钟数
链接:待补充
创建秒表{@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());
链接:待补充
创建秒表{@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 id | id 用于标识秒表的唯一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());
链接:待补充
生日转为年龄,计算法定年龄
参数名 | 描述 |
---|---|
String birthDay | birthDay 生日,标准日期字符串 |
年龄
String birthDay = "2019-05-19";
//生日转为年龄,计算法定年龄(生日,标准日期字符串)
int ageOfNow = DateUtil.ageOfNow(birthDay);
System.out.println(ageOfNow);
链接:待补充
生日转为年龄,计算法定年龄
参数名 | 描述 |
---|---|
Date birthDay | birthDay 生日 |
年龄
String birthDay = "2019-05-19";
//生日转为年龄,计算法定年龄(生日,标准日期字符串)
Date birthDate = DateUtil.parse(birthDay);
int ageOfNow = DateUtil.ageOfNow(birthDate);
System.out.println(ageOfNow);
链接:待补充
是否闰年
参数名 | 描述 |
---|---|
int year | year 年 |
是否闰年
Assert.assertEquals(true, DateUtil.isLeapYear(2020));
Assert.assertEquals(false, DateUtil.isLeapYear(2021));
链接:待补充
计算相对于dateToCompare的年龄,长用于计算指定生日在某年的年龄
参数名 | 描述 |
---|---|
Date birthday | birthday 生日 |
Date dateToCompare | dateToCompare 需要对比的日期 |
年龄
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);
链接:待补充
HH:mm:ss 时间格式字符串转为秒数<br>
参考:https://github.com/iceroot
3.1.2
参数名 | 描述 |
---|---|
String timeStr | timeStr 字符串时分秒(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);
链接:待补充
秒数转为时间格式(HH:mm:ss)<br>
参考:https://github.com/iceroot
3.1.2
参数名 | 描述 |
---|---|
int seconds | seconds 需要转换的秒数 |
转换后的字符串
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);
链接:待补充
创建日期范围生成器
参数名 | 描述 |
---|---|
Date start | start 起始日期时间 |
Date end | end 结束日期时间 |
DateField unit | unit 步进单位 |
{@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) {
}
链接:待补充
创建日期范围生成器
参数名 | 描述 |
---|---|
Date start | start 起始日期时间 |
Date end | end 结束日期时间 |
DateField unit | unit 步进单位 |
{@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"));
链接:待补充
通过生日计算星座
4.4.3
参数名 | 描述 |
---|---|
int month | month 月,从0开始计数 |
int day | day 天 |
星座名
//month从0开始计数
Assert.assertEquals("射手座", DateUtil.getZodiac(11,21));
链接:待补充
计算生肖,只计算1900年后出生的人
4.4.3
参数名 | 描述 |
---|---|
int year | year 农历年 |
生肖名
//month从0开始计数
Assert.assertEquals("马", DateUtil.getChineseZodiac(1990));
链接:待补充
{@code null}安全的日期比较,{@code null}对象排在末尾
4.6.2
参数名 | 描述 |
---|---|
Date date1 | date1 日期1 |
Date date2 | date2 日期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));
链接:待补充
{@code null}安全的日期比较,并只比较指定格式; {@code null}对象排在末尾, 并指定日期格式;
5.6.4
参数名 | 描述 |
---|---|
Date date1 | date1 日期1 |
Date date2 | date2 日期2 |
String format | format 日期格式,常用格式见: {@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));
链接:待补充
纳秒转毫秒
4.6.6
参数名 | 描述 |
---|---|
long duration | duration 时长 |
时长毫秒
//纳秒转毫秒
Assert.assertEquals(1000,DateUtil.nanosToMillis(1000*1000*1000));
链接:待补充
纳秒转秒,保留小数
4.6.6
参数名 | 描述 |
---|---|
long duration | duration 时长 |
秒
DateUtil.nanosToSeconds(1000*1000*1000)
链接:待补充
Date对象转换为{@link Instant}对象
5.0.2
参数名 | 描述 |
---|---|
Date date | date 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);
链接:待补充
Date对象转换为{@link Instant}对象
5.0.2
参数名 | 描述 |
---|---|
TemporalAccessor temporalAccessor | temporalAccessor 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);
链接:待补充
{@link Instant} 转换为 {@link LocalDateTime},使用系统默认时区
5.0.5
参数名 | 描述 |
---|---|
Instant instant | instant {@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);
链接:待补充
{@link Date} 转换为 {@link LocalDateTime},使用系统默认时区
5.0.5
参数名 | 描述 |
---|---|
Date date | date {@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);
链接:待补充
获得指定年份的总天数
5.3.6
参数名 | 描述 |
---|---|
int year | year 年份 |
天
int dayOfYear = DateUtil.dayOfYear(DateUtil.parse("2020-01-01"));
Assert.assertEquals(1, dayOfYear);
int lengthOfYear = DateUtil.lengthOfYear(2020);
Assert.assertEquals(366, lengthOfYear);
链接:待补充
获得指定月份的总天数
5.4.2
参数名 | 描述 |
---|---|
int month | month 月份 |
boolean isLeapYear | isLeapYear 是否闰年 |
天
int lengthOfMonth = DateUtil.lengthOfMonth(2,true);
Assert.assertEquals(29, lengthOfMonth);
lengthOfMonth = DateUtil.lengthOfMonth(2,false);
Assert.assertEquals(28, lengthOfMonth);
链接:待补充
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://xiaoxuzhu.blog.csdn.net/article/details/117431081
内容来源于网络,如有侵权,请联系作者删除!