in brooklyn-server/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java [195:283]
public static String makeTimeStringNano(long tn, boolean round) {
if (tn<0) return "-"+makeTimeStringNano(-tn, round);
// units don't matter, but since ms is the usual finest granularity let's use it
// (previously was just "0" but that was too ambiguous in contexts like "took 0")
if (tn==0) return "0ms";
long tnm = tn % 1000000;
long t = tn/1000000;
String result = "";
long d = t/MILLIS_IN_DAY; t %= MILLIS_IN_DAY;
long h = t/MILLIS_IN_HOUR; t %= MILLIS_IN_HOUR;
long m = t/MILLIS_IN_MINUTE; t %= MILLIS_IN_MINUTE;
long s = t/MILLIS_IN_SECOND; t %= MILLIS_IN_SECOND;
long ms = t;
int segments = 0;
if (d>0) { result += d+"d "; segments++; }
if (h>0) { result += h+"h "; segments++; }
if (round && segments>=2) return Strings.removeAllFromEnd(result, " ");
if (m>0) { result += m+"m "; segments++; }
if (round && (segments>=2 || d>0)) return Strings.removeAllFromEnd(result, " ");
if (s>0) {
if (ms==0 && tnm==0) {
result += s+"s"; segments++;
return result;
}
if (round && segments>0) {
result += s+"s"; segments++;
return result;
}
if (round && s>10) {
result += toDecimal(s, ms/1000.0, 1)+"s"; segments++;
return result;
}
if (round) {
result += toDecimal(s, ms/1000.0, 2)+"s"; segments++;
return result;
}
result += s+"s ";
}
if (round && segments>0)
return Strings.removeAllFromEnd(result, " ");
if (ms>0) {
if (tnm==0) {
result += ms+"ms"; segments++;
return result;
}
if (round && ms>=100) {
result += toDecimal(ms, tnm/1000000.0, 1)+"ms"; segments++;
return result;
}
if (round && ms>=10) {
result += toDecimal(ms, tnm/1000000.0, 2)+"ms"; segments++;
return result;
}
if (round) {
result += toDecimal(ms, tnm/1000000.0, 3)+"ms"; segments++;
return result;
}
result += ms+"ms ";
}
long us = tnm/1000;
long ns = tnm % 1000;
if (us>0) {
if (ns==0) {
result += us+"us"; segments++;
return result;
}
if (round && us>=100) {
result += toDecimal(us, ns/1000.0, 1)+"us"; segments++;
return result;
}
if (round && us>=10) {
result += toDecimal(us, ns/1000.0, 2)+"us"; segments++;
return result;
}
if (round) {
result += toDecimal(us, ns/1000.0, 3)+"us"; segments++;
return result;
}
result += us+"us ";
}
if (ns>0) result += ns+"ns";
return Strings.removeAllFromEnd(result, " ");
}