package com.lassekoskela.time;
import com.google.common.base.Objects;
public class Duration {
private static final int MILLIS_IN_HOUR = 60 * 60 * 1000;
private static final int MILLIS_IN_MINUTE = 60 * 1000;
private static final int MILLIS_IN_SECOND = 1000;
private long hours;
private long minutes;
private long seconds;
private long millis;
private final long inMilliseconds;
public Duration(long milliseconds) {
inMilliseconds = milliseconds;
calculateTimeUnitsFrom(milliseconds);
}
@Override
public int hashCode(){
return Objects.hashCode(inMilliseconds);
}
@Override
public boolean equals(Object obj) {
if (!obj.getClass().equals(getClass())) {
return false;
}
return this.inMilliseconds == ((Duration) obj).inMilliseconds;
}
private void calculateTimeUnitsFrom(long remainingMillis) {
// hours
hours = remainingMillis / MILLIS_IN_HOUR;
remainingMillis -= (hours * MILLIS_IN_HOUR);
// minutes
minutes = remainingMillis / MILLIS_IN_MINUTE;
remainingMillis -= (minutes * MILLIS_IN_MINUTE);
// seconds
seconds = remainingMillis / MILLIS_IN_SECOND;
remainingMillis -= (seconds * MILLIS_IN_SECOND);
// milliseconds
millis = remainingMillis;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
if (hours > 0) {
s.append(" ").append(hours).append("h");
}
if (minutes > 0) {
s.append(" ").append(minutes).append("m");
}
if (seconds > 0) {
s.append(" ").append(seconds).append("s");
}
if (millis > 0) {
s.append(" ").append(millis).append("ms");
}
return s.toString().trim();
}
public long inMillis() {
return inMilliseconds;
}
public double inSeconds() {
return inMillis() / 1000.0;
}
public double percentageOf(long milliseconds) {
return (inMillis() * 100.0) / milliseconds;
}
public double percentageOf(Duration duration) {
return percentageOf(duration.inMillis());
}
}