From 30d50c9a7bf0fa65063392d63e77dc97dc83e058 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Fri, 14 Jun 2024 15:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A8=20perf(core):=20=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E5=B7=A5=E5=85=B7=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=AE=BE=E7=BD=AE=E5=8D=95=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/date/BetweenFormatter.java | 61 +++++++++++++++---- .../core/date/BetweenFormatterTest.java | 39 ++++++++++-- 2 files changed, 85 insertions(+), 15 deletions(-) diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/date/BetweenFormatter.java b/hutool-core/src/main/java/org/dromara/hutool/core/date/BetweenFormatter.java index 2acd563ff..e9f2a4a26 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/date/BetweenFormatter.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/date/BetweenFormatter.java @@ -15,6 +15,7 @@ package org.dromara.hutool.core.date; import org.dromara.hutool.core.text.StrUtil; import java.io.Serializable; +import java.util.function.Function; /** * 时长格式化器,用于格式化输出两个日期相差的时长
@@ -30,6 +31,10 @@ import java.io.Serializable; public class BetweenFormatter implements Serializable { private static final long serialVersionUID = 1L; + /** + * 单位格式化器 + */ + public static Function DEFAULT_LEVEL_FORMATTER = (level) -> level.name; /** * 时长毫秒数 */ @@ -47,6 +52,14 @@ public class BetweenFormatter implements Serializable { * 如为{@code true},输出 1小时3秒,为{@code false}输出 1小时0分3秒 */ private boolean simpleMode = true; + /** + * 格式化器 + */ + private Function levelFormatter = DEFAULT_LEVEL_FORMATTER; + /** + * 分隔符 + */ + private String separator = StrUtil.EMPTY; /** * 创建 BetweenFormatter @@ -105,46 +118,50 @@ public class BetweenFormatter implements Serializable { // 天 if (isLevelCountValid(levelCount) && day > 0) { - sb.append(day).append(Level.DAY.name); + sb.append(day).append(levelFormatter.apply(Level.DAY)).append(separator); levelCount++; } // 时 if (isLevelCountValid(levelCount) && level >= Level.HOUR.ordinal()) { - if(hour >0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))){ - sb.append(hour).append(Level.HOUR.name); + if (hour > 0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))) { + sb.append(hour).append(levelFormatter.apply(Level.HOUR)).append(separator); levelCount++; } } // 分 if (isLevelCountValid(levelCount) && level >= Level.MINUTE.ordinal()) { - if(minute >0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))){ - sb.append(minute).append(Level.MINUTE.name); + if (minute > 0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))) { + sb.append(minute).append(levelFormatter.apply(Level.MINUTE)).append(separator); levelCount++; } } // 秒 if (isLevelCountValid(levelCount) && level >= Level.SECOND.ordinal()) { - if(second >0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))){ - sb.append(second).append(Level.SECOND.name); + if (second > 0 || (!this.simpleMode && StrUtil.isNotEmpty(sb))) { + sb.append(second).append(levelFormatter.apply(Level.SECOND)).append(separator); levelCount++; } } // 毫秒 if (isLevelCountValid(levelCount) && millisecond > 0 && level >= Level.MILLISECOND.ordinal()) { - sb.append(millisecond).append(Level.MILLISECOND.name); + sb.append(millisecond).append(levelFormatter.apply(Level.MILLISECOND)).append(separator); // levelCount++; } } if (StrUtil.isEmpty(sb)) { - sb.append(0).append(this.level.name); + sb.append(0).append(levelFormatter.apply(this.level)); + } else { + if (StrUtil.isNotEmpty(separator)) { + sb.delete(sb.length() - separator.length(), sb.length()); + } } - - return sb.toString(); + // 自定义实现最后可能存在空格 + return sb.toString().trim(); } /** @@ -199,6 +216,28 @@ public class BetweenFormatter implements Serializable { return this; } + /** + * 设置级别格式化器 + * + * @param levelFormatter 级别格式化器 + * @return this + */ + public BetweenFormatter setLevelFormatter(Function levelFormatter) { + this.levelFormatter = levelFormatter; + return this; + } + + /** + * 设置分隔符 + * + * @param separator 分割符 + * @return this + */ + public BetweenFormatter setSeparator(String separator) { + this.separator = separator == null ? StrUtil.EMPTY : separator; + return this; + } + /** * 格式化等级枚举 * diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/date/BetweenFormatterTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/date/BetweenFormatterTest.java index f63375cdf..0ad02a5b1 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/date/BetweenFormatterTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/date/BetweenFormatterTest.java @@ -12,34 +12,62 @@ package org.dromara.hutool.core.date; +import org.dromara.hutool.core.text.StrUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.function.Function; + public class BetweenFormatterTest { + Function levelFormatterEn = level -> { + switch (level) { + case DAY: + return " day"; + case HOUR: + return " hour"; + case MINUTE: + return " minute"; + case SECOND: + return " second"; + case MILLISECOND: + return " millisecond"; + default: + return " " + level.name(); + } + }; + @Test - public void formatTest(){ + public void formatTest() { final long betweenMs = DateUtil.betweenMs(DateUtil.parse("2017-01-01 22:59:59"), DateUtil.parse("2017-01-02 23:59:58")); final BetweenFormatter formatter = new BetweenFormatter(betweenMs, BetweenFormatter.Level.MILLISECOND, 1); Assertions.assertEquals(formatter.toString(), "1天"); } @Test - public void formatBetweenTest(){ + public void formatTestEn() { + final long betweenMs = DateUtil.betweenMs(DateUtil.parse("2017-01-01 22:59:59"), DateUtil.parse("2017-01-02 23:59:58")); + final BetweenFormatter formatter = new BetweenFormatter(betweenMs, BetweenFormatter.Level.MILLISECOND, 1); + formatter.setLevelFormatter(levelFormatterEn); + Assertions.assertEquals(formatter.toString(), "1 day"); + } + + @Test + public void formatBetweenTest() { final long betweenMs = DateUtil.betweenMs(DateUtil.parse("2018-07-16 11:23:19"), DateUtil.parse("2018-07-16 11:23:20")); final BetweenFormatter formatter = new BetweenFormatter(betweenMs, BetweenFormatter.Level.SECOND, 1); Assertions.assertEquals(formatter.toString(), "1秒"); } @Test - public void formatBetweenTest2(){ + public void formatBetweenTest2() { final long betweenMs = DateUtil.betweenMs(DateUtil.parse("2018-07-16 12:25:23"), DateUtil.parse("2018-07-16 11:23:20")); final BetweenFormatter formatter = new BetweenFormatter(betweenMs, BetweenFormatter.Level.SECOND, 5); Assertions.assertEquals(formatter.toString(), "1小时2分3秒"); } @Test - public void formatTest2(){ + public void formatTest2() { final BetweenFormatter formatter = new BetweenFormatter(584, BetweenFormatter.Level.SECOND, 1); Assertions.assertEquals(formatter.toString(), "0秒"); } @@ -54,5 +82,8 @@ public class BetweenFormatterTest { s = BetweenFormatter.of(3600000, BetweenFormatter.Level.MILLISECOND).setSimpleMode(false).format(); Assertions.assertEquals("1小时0分0秒", s); + + s = BetweenFormatter.of(3600000, BetweenFormatter.Level.MILLISECOND).setSimpleMode(false).setLevelFormatter(levelFormatterEn).setSeparator(",").format(); + Assertions.assertEquals("1 hour,0 minute,0 second", s); } }