В чем разница использования TemporalAmount или TemporalUnit в Java 8?

Я пишу некоторый фрагмент кода в Java 8, который использует арифметику времени. Я понимаю, что могу реализовать по-разному. Давайте посмотрим на простой код ниже. Конечно, это тот же результат, но я запутался, какой способ в основном применяется или наиболее эффективен для выполнения арифметических операций в Java 8 ?

LocalTime time = LocalTime.now();
// 1st way
LocalTime plusOp = time.plus(Duration.ofMinutes(10L));
// 2nd way
LocalTime plusOp2 = time.plus(10L, ChronoUnit.MINUTES);
System.out.println(plusOp);
System.out.println(plusOp2);
// 3. way simply
 time.plusMinutes(10L);

спасибо заранее.

2 ответов


Duration может обрабатывать только периоды фиксированной длины, такие как "часы", "минуты", "секунды", "дни" (где это предполагает ровно 24 часа в день). Вы не можете использовать "месяцы" с Duration, потому что месяц варьируется по длине.

Period - другие общие TemporalAmount реализация-представляет годы, месяцы и дни отдельно.

лично я бы порекомендовал:

  • когда вы знаете устройство заранее, используйте соответствующий plusXxx метод, например time.plusMinutes(10). Это почти так же легко читать, как и получается.
  • когда вы пытаетесь представить" логические " суммы Календаря, используйте Period
  • когда вы пытаетесь представить суммы "фиксированной длины", используйте Duration

вот пример, где Period и Duration могут отличаться:

import java.time.*;

public class Test {
    public static void main(String[] args) {
        ZoneId zone = ZoneId.of("Europe/London");
        // At 2015-03-29T01:00:00Z, Europe/London goes from UTC+0 to UTC+1
        LocalDate transitionDate = LocalDate.of(2015, 3, 29);
        ZonedDateTime start = ZonedDateTime.of(transitionDate, LocalTime.MIDNIGHT, zone);
        ZonedDateTime endWithDuration = start.plus(Duration.ofDays(1));
        ZonedDateTime endWithPeriod = start.plus(Period.ofDays(1));
        System.out.println(endWithDuration); // 2015-03-30T01:00+01:00[Europe/London]
        System.out.println(endWithPeriod);   // 2015-03-30T00:00+01:00[Europe/London]
    }
}

Я бы не беспокоился об эффективности, пока вам действительно не нужно - в какой момент Вы должны иметь эталон, чтобы вы могли тестировать разные опции.


если вы посмотрите на источник, то plus(long amountToAdd, TemporalUnit unit) метод использует plusXXX методы для получения результатов. Поэтому здесь нет никаких аргументов в пользу эффективности.

вместо этого вы используете то, что наиболее подходит для вашего сценария. Я бы предложил, если вы используете пользовательский ввод, чтобы решить, добавлять ли часы, минуты и т. д. тогда plus() способ лучше. В противном случае, ваш код будет легче читать, если вы используете plusXXX.