From 24a4c479c457011b154fbc3a358055a1d35d87a0 Mon Sep 17 00:00:00 2001 From: bwcx_jzy Date: Fri, 14 Jun 2024 15:54:04 +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 --- .../cn/hutool/core/date/BetweenFormatter.java | 53 ++++++++++++++++--- .../core/date/BetweenFormatterTest.java | 44 +++++++++++++-- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/date/BetweenFormatter.java b/hutool-core/src/main/java/cn/hutool/core/date/BetweenFormatter.java index a24680a74..2421b0946 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/BetweenFormatter.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/BetweenFormatter.java @@ -3,6 +3,7 @@ package cn.hutool.core.date; import cn.hutool.core.util.StrUtil; import java.io.Serializable; +import java.util.function.Function; /** * 时长格式化器,用于格式化输出两个日期相差的时长
@@ -18,6 +19,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; /** * 时长毫秒数 */ @@ -30,6 +35,14 @@ public class BetweenFormatter implements Serializable { * 格式化级别的最大个数 */ private final int levelMaxCount; + /** + * 格式化器 + */ + private Function levelFormatter = DEFAULT_LEVEL_FORMATTER; + /** + * 分隔符 + */ + private String separator = StrUtil.EMPTY; /** * 构造 @@ -74,31 +87,34 @@ public class BetweenFormatter implements Serializable { int levelCount = 0; if (isLevelCountValid(levelCount) && 0 != day && level >= Level.DAY.ordinal()) { - sb.append(day).append(Level.DAY.name); + sb.append(day).append(levelFormatter.apply(Level.DAY)).append(separator); levelCount++; } if (isLevelCountValid(levelCount) && 0 != hour && level >= Level.HOUR.ordinal()) { - sb.append(hour).append(Level.HOUR.name); + sb.append(hour).append(levelFormatter.apply(Level.HOUR)).append(separator); levelCount++; } if (isLevelCountValid(levelCount) && 0 != minute && level >= Level.MINUTE.ordinal()) { - sb.append(minute).append(Level.MINUTE.name); + sb.append(minute).append(levelFormatter.apply(Level.MINUTE)).append(separator); levelCount++; } if (isLevelCountValid(levelCount) && 0 != second && level >= Level.SECOND.ordinal()) { - sb.append(second).append(Level.SECOND.name); + sb.append(second).append(levelFormatter.apply(Level.SECOND)).append(separator); levelCount++; } if (isLevelCountValid(levelCount) && 0 != millisecond && 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(); } @@ -138,6 +154,29 @@ public class BetweenFormatter implements Serializable { this.level = level; } + /** + * 设置级别格式化器 + * + * @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/cn/hutool/core/date/BetweenFormatterTest.java b/hutool-core/src/test/java/cn/hutool/core/date/BetweenFormatterTest.java index f196ef4a5..29102976d 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/BetweenFormatterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/BetweenFormatterTest.java @@ -4,31 +4,67 @@ import cn.hutool.core.date.BetweenFormatter.Level; import org.junit.Assert; import org.junit.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() { long betweenMs = DateUtil.betweenMs(DateUtil.parse("2017-01-01 22:59:59"), DateUtil.parse("2017-01-02 23:59:58")); BetweenFormatter formater = new BetweenFormatter(betweenMs, Level.MILLISECOND, 1); Assert.assertEquals(formater.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); + Assert.assertEquals(formatter.toString(), "1 day"); + } + + @Test + public void formatTestEn2() { + final long betweenMs = 3610001; + final BetweenFormatter formatter = new BetweenFormatter(betweenMs, BetweenFormatter.Level.MILLISECOND, 5); + formatter.setSeparator(","); + formatter.setLevelFormatter(levelFormatterEn); + Assert.assertEquals(formatter.toString(), "1 hour,10 second,1 millisecond"); + } + + @Test + public void formatBetweenTest() { long betweenMs = DateUtil.betweenMs(DateUtil.parse("2018-07-16 11:23:19"), DateUtil.parse("2018-07-16 11:23:20")); BetweenFormatter formater = new BetweenFormatter(betweenMs, Level.SECOND, 1); Assert.assertEquals(formater.toString(), "1秒"); } @Test - public void formatBetweenTest2(){ + public void formatBetweenTest2() { long betweenMs = DateUtil.betweenMs(DateUtil.parse("2018-07-16 12:25:23"), DateUtil.parse("2018-07-16 11:23:20")); BetweenFormatter formater = new BetweenFormatter(betweenMs, Level.SECOND, 5); Assert.assertEquals(formater.toString(), "1小时2分3秒"); } @Test - public void formatTest2(){ + public void formatTest2() { BetweenFormatter formater = new BetweenFormatter(584, Level.SECOND, 1); Assert.assertEquals(formater.toString(), "0秒"); }