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

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

提前致谢。

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

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

如果查看源代码, plus(long amountToAdd, TemporalUnit unit)方法使用plusXXX方法生成结果。 所以这里没有关于效率的论据。

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