package org.ovirt.engine.core.common.utils; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class TimeConverter { private static final List<TimeUnit> orderedTimeUnits = Arrays.stream(TimeUnit.values()) .sorted(Comparator.comparing((TimeUnit u) -> TimeUnit.MICROSECONDS.convert(1L, u)).reversed()) .collect(Collectors.toList()); /* * This method converts an input time interval (interval) in an input unit(fromUnit) to a desired output * unit(toUnit). It is basically a wrapper around the java.util.concurrent.TimeUnit 's convert function This is * method is written just for ease of use as the java.util.concurrent.TimeUnit 's convert function usage is of the * form TimeUnit.Minutes.convert(60L, TimeUnit.Seconds) to convert 60 seconds to a minuite */ public static long convert(long interval, TimeUnit fromUnit, TimeUnit toUnit) { return TimeUnit.valueOf(toUnit.name()).convert(interval, fromUnit); } /* * This method is introduced for the purpose of making it easy to express the input interval of time in an input * unit into its highest possible unit such that the integral value of the converted interval is of non-zero * magnitude. ex : 60 * 1000 * 1000 microseconds = 1 min */ public static Pair<Long, TimeUnit> autoConvert(long interval, TimeUnit fromUnit) { Pair<Long, TimeUnit> result = new Pair<>(); for (TimeUnit timeUnit : orderedTimeUnits) { long tInterval = interval; interval = convert(interval, fromUnit, timeUnit); if (interval >= 1) { result.setFirst(interval); result.setSecond(timeUnit); break; } interval = tInterval; } return result; } }