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

Ugu*_*tun 14 java datetime java-8 java-time

我在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);
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Jon*_*eet 20

Duration只能处理固定长度的时间段,例如"小时","分钟","秒","天"(每天恰好24小时).您不能使用"月" Duration,因为一个月的长度不同.

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]
    }
}
Run Code Online (Sandbox Code Playgroud)

在您真正需要之前我不会担心效率 - 此时您应该有一个基准测试,以便您可以测试不同的选项.