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秒");
}