Мне нравится твой собственный ответ .Я знаю, что это не то, что вы просили, но я хотел бы представить один или два варианта для Java 8 для случаев, когда мы хотим урезать до единицы, отличной от секунд.
Если мы знаем единицу вкогда мы пишем код, мы можем комбинировать методы toXx
и ofXx
для формирования усеченной длительности:
Duration d = Duration.ofMillis(myDuration.toMillis());
Duration d = Duration.ofSeconds(myDuration.toSeconds());
Duration d = Duration.ofMinutes(myDuration.toMinutes());
Duration d = Duration.ofHours(myDuration.toHours());
Duration d = Duration.ofDays(myDuration.toDays());
Если единица является переменной, мы можем адаптировать код из реализациииз упомянутого выше метода Java 9 truncatedTo
:
Duration d;
if (unit.equals(ChronoUnit.SECONDS)
&& (myDuration.getSeconds() >= 0 || myDuration.getNano() == 0)) {
d = Duration.ofSeconds(myDuration.getSeconds());
} else if (unit == ChronoUnit.NANOS) {
d = myDuration;
}
Duration unitDur = unit.getDuration();
if (unitDur.getSeconds() > TimeUnit.DAYS.toSeconds(1)) {
throw new UnsupportedTemporalTypeException("Unit is too large to be used for truncation");
}
long dur = unitDur.toNanos();
if ((TimeUnit.DAYS.toNanos(1) % dur) != 0) {
throw new UnsupportedTemporalTypeException("Unit must divide into a standard day without remainder");
}
long nod = (myDuration.getSeconds() % TimeUnit.DAYS.toSeconds(1)) * TimeUnit.SECONDS.toNanos(1)
+ myDuration.getNano();
long result = (nod / dur) * dur;
d = myDuration.plusNanos(result - nod);
В оригинальном методе использовались некоторые личные вещи из класса Duration
, поэтому потребовался ряд изменений.Код принимает только ChronoUnit
единиц, а не другие TemporalUnit
с.Я не подумал, насколько сложно это обобщить.