You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by ki...@apache.org on 2021/02/18 02:08:56 UTC

[incubator-dolphinscheduler] branch dev updated: [Improvement-4751][API] Improvement the duration field modify the display to a time-based minute-second format (e.g. 1d 10h 20m 1s) (#4752)

This is an automated email from the ASF dual-hosted git repository.

kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 23591b7  [Improvement-4751][API] Improvement the duration field modify the display to a time-based minute-second format (e.g. 1d 10h 20m 1s) (#4752)
23591b7 is described below

commit 23591b71a2859021e9280899b1f1b6ff3b679fbc
Author: zhuangchong <37...@users.noreply.github.com>
AuthorDate: Thu Feb 18 10:08:23 2021 +0800

    [Improvement-4751][API] Improvement the duration field modify the display to a time-based minute-second format (e.g. 1d 10h 20m 1s) (#4752)
    
    * imp ui instance duration field display content.
    
    * update DateUtils format2Duration method.
---
 .../api/service/ProcessInstanceService.java        |  2 +-
 .../api/service/TaskInstanceService.java           |  2 +-
 .../service/impl/ProcessDefinitionServiceImpl.java |  2 +-
 .../dolphinscheduler/common/utils/DateUtils.java   | 86 +++++++++++++++++++++-
 .../common/utils/DateUtilsTest.java                | 39 ++++++++++
 .../dao/entity/ProcessInstance.java                |  6 +-
 .../dolphinscheduler/dao/entity/TaskInstance.java  |  8 +-
 7 files changed, 131 insertions(+), 14 deletions(-)

diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
index b41ff71..6458a76 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessInstanceService.java
@@ -256,7 +256,7 @@ public class ProcessInstanceService extends BaseService {
         List<ProcessInstance> processInstances = processInstanceList.getRecords();
 
         for (ProcessInstance processInstance : processInstances) {
-            processInstance.setDuration(DateUtils.differSec(processInstance.getStartTime(), processInstance.getEndTime()));
+            processInstance.setDuration(DateUtils.format2Duration(processInstance.getStartTime(), processInstance.getEndTime()));
             User executor = usersService.queryUser(processInstance.getExecutorId());
             if (null != executor) {
                 processInstance.setExecutorName(executor.getUserName());
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java
index dd2caff..6c68202 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/TaskInstanceService.java
@@ -131,7 +131,7 @@ public class TaskInstanceService extends BaseService {
         List<TaskInstance> taskInstanceList = taskInstanceIPage.getRecords();
 
         for (TaskInstance taskInstance : taskInstanceList) {
-            taskInstance.setDuration(DateUtils.differSec(taskInstance.getStartTime(), taskInstance.getEndTime()));
+            taskInstance.setDuration(DateUtils.format2Duration(taskInstance.getStartTime(), taskInstance.getEndTime()));
             User executor = usersService.queryUser(taskInstance.getExecutorId());
             if (null != executor) {
                 taskInstance.setExecutorName(executor.getUserName());
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index af91ed2..2a2ae78 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -1327,7 +1327,7 @@ public class ProcessDefinitionServiceImpl extends BaseService implements
         List<ProcessInstance> processInstanceList = processInstanceService.queryByProcessDefineId(processId, limit);
 
         for (ProcessInstance processInstance : processInstanceList) {
-            processInstance.setDuration(DateUtils.differSec(processInstance.getStartTime(), processInstance.getEndTime()));
+            processInstance.setDuration(DateUtils.format2Duration(processInstance.getStartTime(), processInstance.getEndTime()));
         }
 
         if (limit > processInstanceList.size()) {
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/DateUtils.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/DateUtils.java
index 80c0ed4..a531299 100644
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/DateUtils.java
+++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/DateUtils.java
@@ -241,16 +241,51 @@ public class DateUtils {
      */
     public static String format2Readable(long ms) {
 
-        long days = ms / (1000 * 60 * 60 * 24);
-        long hours = (ms % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
-        long minutes = (ms % (1000 * 60 * 60)) / (1000 * 60);
-        long seconds = (ms % (1000 * 60)) / 1000;
+        long days = MILLISECONDS.toDays(ms);
+        long hours = MILLISECONDS.toDurationHours(ms);
+        long minutes = MILLISECONDS.toDurationMinutes(ms);
+        long seconds = MILLISECONDS.toDurationSeconds(ms);
 
         return String.format("%02d %02d:%02d:%02d", days, hours, minutes, seconds);
 
     }
 
     /**
+     *
+     * format time to duration
+     *
+     * @param d1 d1
+     * @param d2 d2
+     * @return format time
+     */
+    public static String format2Duration(Date d1, Date d2) {
+        return format2Duration(differMs(d1, d2));
+    }
+
+    /**
+     * format time to duration
+     *
+     * @param ms ms
+     * @return format time
+     */
+    public static String format2Duration(long ms) {
+
+        long days = MILLISECONDS.toDays(ms);
+        long hours = MILLISECONDS.toDurationHours(ms);
+        long minutes = MILLISECONDS.toDurationMinutes(ms);
+        long seconds = MILLISECONDS.toDurationSeconds(ms);
+
+        StringBuilder strBuilder = new StringBuilder();
+        strBuilder = days > 0 ? strBuilder.append(days).append("d").append(" ") : strBuilder;
+        strBuilder = hours > 0 ? strBuilder.append(hours).append("h").append(" ") : strBuilder;
+        strBuilder = minutes > 0 ? strBuilder.append(minutes).append("m").append(" ") : strBuilder;
+        strBuilder = seconds > 0 ? strBuilder.append(seconds).append("s") : strBuilder;
+
+        return strBuilder.toString();
+
+    }
+
+    /**
      * get monday
      * <p>
      * note: Set the first day of the week to Monday, the default is Sunday
@@ -454,4 +489,47 @@ public class DateUtils {
         return getCurrentTime(Constants.YYYYMMDDHHMMSSSSS);
     }
 
+    static final long C0 = 1L;
+    static final long C1 = C0 * 1000L;
+    static final long C2 = C1 * 1000L;
+    static final long C3 = C2 * 1000L;
+    static final long C4 = C3 * 60L;
+    static final long C5 = C4 * 60L;
+    static final long C6 = C5 * 24L;
+
+    /**
+     * Time unit representing one thousandth of a second
+     */
+    public static class MILLISECONDS {
+
+        public static long toSeconds(long d) {
+            return d / (C3 / C2);
+        }
+
+        public static long toMinutes(long d) {
+            return d / (C4 / C2);
+        }
+
+        public static long toHours(long d)   {
+            return d / (C5 / C2);
+        }
+
+        public static long toDays(long d)    {
+            return d / (C6 / C2);
+        }
+
+        public static long toDurationSeconds(long d)   {
+            return (d % (C4 / C2)) / (C3 / C2);
+        }
+
+        public static long toDurationMinutes(long d)   {
+            return (d % (C5 / C2)) / (C4 / C2);
+        }
+
+        public static long toDurationHours(long d)   {
+            return (d % (C6 / C2)) / (C5 / C2);
+        }
+
+    }
+
 }
diff --git a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/DateUtilsTest.java b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/DateUtilsTest.java
index fa16446..63f0be5 100644
--- a/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/DateUtilsTest.java
+++ b/dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/DateUtilsTest.java
@@ -157,4 +157,43 @@ public class DateUtilsTest {
         Assert.assertNotNull(timeStamp);
     }
 
+    @Test
+    public void testFormat2Duration() {
+
+        // days hours minutes seconds
+        Date d1 = DateUtils.stringToDate("2020-01-20 11:00:00");
+        Date d2 = DateUtils.stringToDate("2020-01-21 12:10:10");
+        String duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("1d 1h 10m 10s", duration);
+
+        // hours minutes seconds
+        d1 = DateUtils.stringToDate("2020-01-20 11:00:00");
+        d2 = DateUtils.stringToDate("2020-01-20 12:10:10");
+        duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("1h 10m 10s", duration);
+
+        // minutes seconds
+        d1 = DateUtils.stringToDate("2020-01-20 11:00:00");
+        d2 = DateUtils.stringToDate("2020-01-20 11:10:10");
+        duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("10m 10s", duration);
+
+        // minutes seconds
+        d1 = DateUtils.stringToDate("2020-01-20 11:10:00");
+        d2 = DateUtils.stringToDate("2020-01-20 11:10:10");
+        duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("10s", duration);
+
+        d1 = DateUtils.stringToDate("2020-01-20 11:10:00");
+        d2 = DateUtils.stringToDate("2020-01-21 11:10:10");
+        duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("1d 10s", duration);
+
+        d1 = DateUtils.stringToDate("2020-01-20 11:10:00");
+        d2 = DateUtils.stringToDate("2020-01-20 16:10:10");
+        duration = DateUtils.format2Duration(d2, d1);
+        Assert.assertEquals("5h 10s", duration);
+
+    }
+
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java
index f1d43a3..03e81dc 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessInstance.java
@@ -202,7 +202,7 @@ public class ProcessInstance {
      * @return
      */
     @TableField(exist = false)
-    private Long duration;
+    private String duration;
 
     /**
      * process instance priority
@@ -547,11 +547,11 @@ public class ProcessInstance {
         this.dependenceScheduleTimes = dependenceScheduleTimes;
     }
 
-    public Long getDuration() {
+    public String getDuration() {
         return duration;
     }
 
-    public void setDuration(Long duration) {
+    public void setDuration(String duration) {
         this.duration = duration;
     }
 
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
index b13ca87..ce8d6d5 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskInstance.java
@@ -14,6 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.dolphinscheduler.dao.entity;
 
 import org.apache.dolphinscheduler.common.enums.ExecutionStatus;
@@ -170,7 +171,7 @@ public class TaskInstance implements Serializable {
      * duration
      */
     @TableField(exist = false)
-    private Long duration;
+    private String duration;
 
     /**
      * max retry times
@@ -437,11 +438,11 @@ public class TaskInstance implements Serializable {
         this.processInstanceName = processInstanceName;
     }
 
-    public Long getDuration() {
+    public String getDuration() {
         return duration;
     }
 
-    public void setDuration(Long duration) {
+    public void setDuration(String duration) {
         this.duration = duration;
     }
 
@@ -505,7 +506,6 @@ public class TaskInstance implements Serializable {
         return TaskType.CONDITIONS.equals(TaskType.valueOf(this.taskType));
     }
 
-
     /**
      * determine if you can try again
      *