diff --git a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
index a609a07474944d787abb25d353fb5e7bc3d73b53..d04c5ddf0efc21b828661f47e493c1a58025f31c 100644
--- a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
+++ b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java
@@ -44,6 +44,7 @@ import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.time.DurationFormatUtils;
 import org.apache.commons.text.StringEscapeUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -163,6 +164,11 @@ public class FessFunctions {
         return date.format(DateTimeFormatter.ofPattern(Constants.ISO_DATETIME_FORMAT, Locale.ROOT));
     }
 
+    public static String formatDuration(final long durationMillis) {
+        return DurationFormatUtils.formatDuration(durationMillis, "d 'days' HH:mm:ss.SSS").replace("0 days", StringUtil.EMPTY).trim();
+
+    }
+
     public static String formatNumber(final long value, final String pattern) {
         final DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(getUserLocale());
         df.applyPattern(pattern);
diff --git a/src/main/webapp/WEB-INF/fe.tld b/src/main/webapp/WEB-INF/fe.tld
index e8c7bb6591684f1fcae833c1dfa46854ecbe108a..9f8c3a8f50b6480fc691f7b7d9117c4ef744f88a 100644
--- a/src/main/webapp/WEB-INF/fe.tld
+++ b/src/main/webapp/WEB-INF/fe.tld
@@ -71,6 +71,18 @@
     </example>
   </function>
 
+  <function>
+    <description>
+      Returns formatted duration from a given value.
+    </description>
+    <name>formatDuration</name>
+    <function-class>org.codelibs.fess.taglib.FessFunctions</function-class>
+    <function-signature>java.lang.String formatDuration(long)</function-signature>
+    <example>
+      ${fe:formatDuration(1234)}
+    </example>
+  </function>
+
   <function>
     <description>
       Returns formatted number as a file size from a given value.