Java 8中使用TemporalAmount和TemporalUnit有什么区别?

22

我在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个回答

36

Duration 只能处理固定长度的时间段,比如 "hours"、"minutes"、"seconds"、"days"(假设每天有 24 小时)。你不能使用 "months",因为一个月的长度是不确定的。

Period 是另一种常见的 TemporalAmount 实现,它分别表示年、月和日。

个人建议:

  • 当你事先知道单位时,请使用相应的 plusXxx 方法,例如 time.plusMinutes(10)。这是最容易理解的方法之一。
  • 当您尝试表示 "逻辑" 日历数量时,请使用 Period
  • 当您尝试表示 "固定长度" 的量时,请使用 Duration

这里是 PeriodDuration 可能存在差异的示例:

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]
    }
}

在你真正需要的时候再考虑效率问题 - 到那时,你应该有一个基准来测试不同的选项。


3
如果你查看源代码,plus(long amountToAdd, TemporalUnit unit) 方法使用 plusXXX 方法来生成结果。因此,在效率方面没有争议。
相反,你应该根据场景选择最合适的方法。如果你使用用户输入来决定是否添加小时、分钟等,则使用 plus() 方法更好。否则,如果使用 plusXXX,你的代码可能更易于阅读。

Duration 中不包括天数,它是一段时间。https://docs.oracle.com/javase/tutorial/datetime/iso/period.html - Atiq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接