package fr.xephi.authme.util.expiring; import java.util.concurrent.TimeUnit; /** * Represents a duration in time, defined by a time unit and a duration. */ public class Duration { private final long duration; private final TimeUnit unit; /** * Constructor. * * @param duration the duration * @param unit the time unit in which {@code duration} is expressed */ public Duration(long duration, TimeUnit unit) { this.duration = duration; this.unit = unit; } /** * Creates a Duration object for the given duration and unit in the most suitable time unit. * For example, {@code createWithSuitableUnit(120, TimeUnit.SECONDS)} will return a Duration * object of 2 minutes. *
* This method only considers the time units days, hours, minutes, and seconds for the objects * it creates. Conversion is done with {@link TimeUnit#convert} and so always rounds the * results down. *
* Further examples:
* createWithSuitableUnit(299, TimeUnit.MINUTES); // 4 hours
* createWithSuitableUnit(700, TimeUnit.MILLISECONDS); // 0 seconds
*
* @param sourceDuration the duration
* @param sourceUnit the time unit the duration is expressed in
* @return Duration object using the most suitable time unit
*/
public static Duration createWithSuitableUnit(long sourceDuration, TimeUnit sourceUnit) {
long durationMillis = Math.abs(TimeUnit.MILLISECONDS.convert(sourceDuration, sourceUnit));
TimeUnit targetUnit;
if (durationMillis > 1000L * 60L * 60L * 24L) {
targetUnit = TimeUnit.DAYS;
} else if (durationMillis > 1000L * 60L * 60L) {
targetUnit = TimeUnit.HOURS;
} else if (durationMillis > 1000L * 60L) {
targetUnit = TimeUnit.MINUTES;
} else {
targetUnit = TimeUnit.SECONDS;
}
long durationInTargetUnit = targetUnit.convert(sourceDuration, sourceUnit);
return new Duration(durationInTargetUnit, targetUnit);
}
/**
* @return the duration
*/
public long getDuration() {
return duration;
}
/**
* @return the time unit in which the duration is expressed
*/
public TimeUnit getTimeUnit() {
return unit;
}
}