diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 5c7101109e83b5b50ae8c4903a05975ac3b6ffc9..17a4ff42aa8ef1da0aafbf92595386fdaf9d0bee 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -1494,11 +1494,11 @@ public class DataHelper { * @since 0.8.2 */ public static String formatDuration2(long ms) { + if (ms == 0) + return "0"; String t; long ams = ms >= 0 ? ms : 0 - ms; - if (ms == 0) { - return "0"; - } else if (ams < 3 * 1000) { + if (ams < 3 * 1000) { // NOTE TO TRANSLATORS: Feel free to translate all these as you see fit, there are several options... // spaces or not, '.' or not, plural or not. Try not to make it too long, it is used in // a lot of tables. @@ -1538,6 +1538,42 @@ public class DataHelper { return t.replace(" ", " "); } + /** + * Like formatDuration2(long) but with microsec and nanosec also. + * + * @since 0.9.19 + */ + public static String formatDuration2(double ms) { + if (ms == 0d) + return "0"; + String t; + double adms = ms >= 0 ? ms : 0 - ms; + long lms = (long) ms; + long ams = lms >= 0 ? lms : 0 - lms; + if (adms < 0.000000001d) { + return "0"; + } else if (adms < 0.001d) { + t = ngettext("1 ns", "{0,number,###} ns", (int) Math.round(ms * 1000000d)); + } else if (adms < 1.0d) { + t = ngettext("1 μs", "{0,number,###} μs", (int) Math.round(ms * 1000d)); + } else if (ams < 3 * 1000) { + t = ngettext("1 ms", "{0,number,####} ms", (int) Math.round(ms)); + } else if (ams < 2 * 60 * 1000) { + t = ngettext("1 sec", "{0} sec", (int) (ms / 1000)); + } else if (ams < 120 * 60 * 1000) { + t = ngettext("1 min", "{0} min", (int) (ms / (60 * 1000))); + } else if (ams < 2 * 24 * 60 * 60 * 1000) { + t = ngettext("1 hour", "{0} hours", (int) (ms / (60 * 60 * 1000))); + } else if (ams > 1000l * 24l * 60l * 60l * 1000l) { + return _("n/a"); + } else { + t = ngettext("1 day", "{0} days", (int) (ms / (24 * 60 * 60 * 1000))); + } + if (ms < 0) + t = t.replace("-", "−"); + return t.replace(" ", " "); + } + private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; private static String _(String key) { diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java index 2fd008b6d65a262e786645577c1753c25517fbb6..9d0a987a8c05f21ef74f204b3800c8f5e6568520 100644 --- a/router/java/src/net/i2p/router/JobStats.java +++ b/router/java/src/net/i2p/router/JobStats.java @@ -55,24 +55,27 @@ public class JobStats { public long getTotalTime() { return _totalTime.get(); } public long getMaxTime() { return _maxTime; } public long getMinTime() { return _minTime; } - public long getAvgTime() { + + public double getAvgTime() { long numRuns = _numRuns.get(); if (numRuns > 0) - return _totalTime.get() / numRuns; + return _totalTime.get() / (double) numRuns; else return 0; } public long getTotalPendingTime() { return _totalPendingTime.get(); } public long getMaxPendingTime() { return _maxPendingTime; } public long getMinPendingTime() { return _minPendingTime; } - public long getAvgPendingTime() { + + public double getAvgPendingTime() { long numRuns = _numRuns.get(); if (numRuns > 0) - return _totalPendingTime.get() / numRuns; + return _totalPendingTime.get() / (double) numRuns; else return 0; } +/**** @Override public int hashCode() { return _job.hashCode(); } @@ -100,4 +103,5 @@ public class JobStats { buf.append(getMaxPendingTime()).append("ms/").append(getMinPendingTime()).append("ms avg/max/min)"); return buf.toString(); } +****/ }