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

2022-09-02 20:32:25

我在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);

提前致谢。


答案 1

Duration只能处理固定长度的时间段,例如“小时”,“分钟”,“秒”,“天”(其中它假设每天正好24小时)。不能将“月”与 一起使用,因为月的长度各不相同。Duration

Period- 其他常见实现 - 分别表示年,月和日。TemporalAmount

我个人会推荐:

  • 如果您事先知道该单位,请使用适当的方法,例如.这几乎很容易阅读。plusXxxtime.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]
    }
}

在你真正需要之前,我不会担心效率 - 在这一点上你应该有一个基准测试,这样你就可以测试不同的选项。


答案 2

如果查看源,则该方法使用这些方法来生成结果。因此,这里没有关于效率的争论。plus(long amountToAdd, TemporalUnit unit)plusXXX

相反,您可以使用最适合您的方案的任何一种。我建议,如果您使用用户输入来决定是否添加小时,分钟等,那么该方法更好。否则,如果使用 ,则代码可能更易于阅读。plus()plusXXX