public class TimeConvertor {
private TimeConvertor() {}
private enum TimeUnits {
MILISECONDS("miliseconds"),
SECONDS("seconds", 1000, MILISECONDS),
MINUTES("minutes", 60, SECONDS),
HOURS("hours", 60, MINUTES),
DAYS("days", 24, HOURS),
WEEKS("weeks", 7, DAYS),
MONTHS("months", 4, WEEKS),
YEARS("years", 365, DAYS);
private TimeUnits(String friendlyName, long commonDivider, TimeUnits parent) {
this(friendlyName, commonDivider * parent.getCommonDivider());
}
private TimeUnits(String friendlyName, long commonDivider) {
this.friendlyName = friendlyName;
this.commonDivider = commonDivider;
}
private TimeUnits(String friendlyName) {
this(friendlyName, 1);
}
private final String friendlyName;
private final long commonDivider;
public long getCommonDivider() {
return commonDivider;
}
public String getFriendlyName() {
return friendlyName;
}
}
public static String convertTime(long time, int maxStringComponents, String delimiter) {
StringBuilder builder = new StringBuilder();
final TimeUnits[] values = TimeUnits.values();
long tempTime= 0;
long tempTimeBuilding;
for (int i = 0; i < maxStringComponents; i++) {
TimeUnits lowestUnit = null;
for (TimeUnits unit : values) {
tempTimeBuilding = time / unit.getCommonDivider();
if (tempTimeBuilding > 0) {
tempTime = tempTimeBuilding;
lowestUnit = unit;
} else {
break;
}
}
if(lowestUnit == null) {
break;
}
if (i != 0) {
builder.append(delimiter);
}
time -= tempTime * lowestUnit.getCommonDivider();
builder.append(tempTime).append(' ').append(lowestUnit.getFriendlyName());
}
return builder.toString();
}
public static void main(String ... args) {
System.out.println(convertTime(1, 3, ", "));
System.out.println(convertTime(10, 3, ", "));
System.out.println(convertTime(100, 3, ", "));
System.out.println(convertTime(1000, 3, ", "));
System.out.println(convertTime(10000, 3, ", "));
System.out.println(convertTime(100000, 3, ", "));
System.out.println(convertTime(1000000, 3, ", "));
System.out.println(convertTime(345127364, 3, ", "));
System.out.println(convertTime(345127364, 30, ", "));
}
}