7hutool实战:DateUtil(时间工具类)

您所在的位置:网站首页 毫秒转出分钟时间计算器怎么用 7hutool实战:DateUtil(时间工具类)

7hutool实战:DateUtil(时间工具类)

2023-12-22 01:56| 来源: 网络整理| 查看: 265

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

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

万字博文教你搞懂java源码的日期和时间相关用法

用途:日期计算 使用场景

包含日期的各种计算方式

项目引用

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

cn.hutool hutool-core 5.6.5 方法摘要 方法描述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) 方法描述

判断两个日期相差的天数

有时候我们计算相差天数的时候需要忽略时分秒。 比如: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 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 preTime preTime 之前记录的时间 返回值:

时间差,毫秒

参考案例: //计时,常用于记录某段代码的执行时间,单位:毫秒 int j= 0; long start = System.currentTimeMillis(); for (int i = 0; i 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 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 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 month month 月,从0开始计数 int day day 天 返回值:

星座名

参考案例: //month从0开始计数 Assert.assertEquals("射手座", DateUtil.getZodiac(11,21)); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.getChineseZodiac(int) 方法描述

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

支持版本及以上

4.4.3

参数描述: 参数名描述int year year 农历年 返回值:

生肖名

参考案例: //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 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)); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.compare(java.util.Date, java.util.Date, java.lang.String) 方法描述

{@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)); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.nanosToMillis(long) 方法描述

纳秒转毫秒

支持版本及以上

4.6.6

参数描述: 参数名描述long duration duration 时长 返回值:

时长毫秒

参考案例: //纳秒转毫秒 Assert.assertEquals(1000,DateUtil.nanosToMillis(1000*1000*1000)); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.nanosToSeconds(long) 方法描述

纳秒转秒,保留小数

支持版本及以上

4.6.6

参数描述: 参数名描述long duration duration 时长 返回值:

参考案例: DateUtil.nanosToSeconds(1000*1000*1000) 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.toInstant(java.util.Date) 方法描述

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); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.toInstant(java.time.temporal.TemporalAccessor) 方法描述

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); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.toLocalDateTime(java.time.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); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.toLocalDateTime(java.util.Date) 方法描述

{@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); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.lengthOfYear(int) 方法描述

获得指定年份的总天数

支持版本及以上

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); 源码解析: 链接:待补充 方法明细 方法名称:cn.hutool.core.date.DateUtil.lengthOfMonth(int, boolean) 方法描述

获得指定月份的总天数

支持版本及以上

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); 源码解析: 链接:待补充


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3