Сократить продолжительность в Java - PullRequest
0 голосов
/ 26 апреля 2018

При захвате прошедшего времени как Duration меня интересует только разрешение целых секунд.

Как убрать дробную секунду из Duration объекта?

Другие классы в java.time инфраструктуре предлагают truncatedTo метод.Но я не вижу ни одного на Duration.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Мне нравится твой собственный ответ .Я знаю, что это не то, что вы просили, но я хотел бы представить один или два варианта для 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 с.Я не подумал, насколько сложно это обобщить.

0 голосов
/ 26 апреля 2018

Java 9 и более поздние версии

Java 9 принесла некоторые незначительные возможности и исправления ошибок в классы java.time , которые дебютировали в Java 8.

Одной из таких функций является добавление метода Duration::truncatedTo, аналогичного таким методам, которые используются в других классах.Передайте ChronoUnit (реализация интерфейса TemporalUnit), чтобы указать детализацию того, что нужно усекать.

Duration d = myDuration.truncatedTo( ChronoUnit.SECONDS ) ;

Java 8

Если вы используете Java 8 и пока не можете перейти на Java 9, 10, 11 или более позднюю версию, рассчитайте усечение самостоятельно.

Вызовите метод minusNanos, найденный в версии 8 Java Duration.Получите количество наносекунд на объекте Duration, затем вычтите это количество наносекунд.

Duration d = myDuration.minusNanos( myDuration.getNano() ) ;

Классы java.time используют шаблон неизменных объектов .Таким образом, вы получаете новый новый объект без изменения («мутирования») оригинала.

...