diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/date/StopWatch.java b/hutool-core/src/main/java/cn/hutool/v7/core/date/StopWatch.java index b58f5293dc..69bbf4c356 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/date/StopWatch.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/date/StopWatch.java @@ -30,8 +30,7 @@ import java.util.concurrent.TimeUnit; * 比如:我们可以记录多段代码耗时时间,然后一次性打印(StopWatch提供了一个prettyString()函数用于按照指定格式打印出耗时) * *

- * 此工具来自:https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/util/StopWatch.java - * + * 此工具来自:StopWatch *

* 使用方法如下: * @@ -195,7 +194,7 @@ public class StopWatch { throw new IllegalStateException("Can't stop StopWatch: it's not running"); } - final long lastTime = System.nanoTime() - this.startTimeNanos; + final long lastTime = Math.max(System.nanoTime() - this.startTimeNanos, 0); this.totalTimeNanos += lastTime; this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime); if (null != this.taskList) { diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/date/IssueIDFMXJTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/date/IssueIDFMXJTest.java new file mode 100644 index 0000000000..e58405d1f1 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/v7/core/date/IssueIDFMXJTest.java @@ -0,0 +1,26 @@ +package cn.hutool.v7.core.date; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; + +public class IssueIDFMXJTest { + + @Test + void stopWatchNegativeTimeTest() throws NoSuchFieldException, IllegalAccessException { + final StopWatch stopWatch = new StopWatch(); + stopWatch.start("负耗时测试任务"); + + // 反射修改startTimeNanos为当前时间+1秒(模拟nanoTime回退) + final Field startTimeNanosField = StopWatch.class.getDeclaredField("startTimeNanos"); + startTimeNanosField.setAccessible(true); + startTimeNanosField.set(stopWatch, System.nanoTime() + 1_000_000_000); + + stopWatch.stop(); + + Assertions.assertEquals(0, stopWatch.getLastTaskTimeNanos()); + Assertions.assertEquals(0, stopWatch.getTotalTimeNanos()); + } + +}