在 Java 8 中使用 TemporalAmount 或 TemporalUnit 有什么区别?
What is the difference of using TemporalAmount or TemporalUnit in Java 8?
我在Java8中写了一段使用时间算法的代码。
我意识到我可以用不同的方式实施。让我们看看下面的简单代码。当然这是相同的结果,但我混淆了哪种方法最适用或最有效地在 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);
提前致谢。
如果您查看源代码,plus(long amountToAdd, TemporalUnit unit)
方法使用 plusXXX
方法生成结果。所以这里没有关于效率的争论。
相反,您可以使用最适合您的方案的那个。我建议,如果您使用用户输入来决定是否添加小时、分钟等,那么 plus()
方法更好。否则,如果您使用 plusXXX
.
,您的代码可能更易于阅读
Duration
只能处理固定长度的时间段,例如 "hours"、"minutes"、"seconds"、"days"(假设恰好是 24 小时每天)。您不能将 "months" 与 Duration
一起使用,因为一个月的长度会有所不同。
Period
- 另一个常见的 TemporalAmount
实现 - 分别代表年、月和日。
我个人会推荐:
- 如果您事先知道单位,请使用适当的
plusXxx
方法,例如time.plusMinutes(10)
。这几乎是最容易阅读的。
- 当您尝试表示 "logical" 日历金额时,请使用
Period
- 当您尝试表示 "fixed length" 金额时,请使用
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]
}
}
除非您确实需要,否则我不会担心效率 - 此时您应该有一个基准,以便您可以测试不同的选项。
我在Java8中写了一段使用时间算法的代码。 我意识到我可以用不同的方式实施。让我们看看下面的简单代码。当然这是相同的结果,但我混淆了哪种方法最适用或最有效地在 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);
提前致谢。
如果您查看源代码,plus(long amountToAdd, TemporalUnit unit)
方法使用 plusXXX
方法生成结果。所以这里没有关于效率的争论。
相反,您可以使用最适合您的方案的那个。我建议,如果您使用用户输入来决定是否添加小时、分钟等,那么 plus()
方法更好。否则,如果您使用 plusXXX
.
Duration
只能处理固定长度的时间段,例如 "hours"、"minutes"、"seconds"、"days"(假设恰好是 24 小时每天)。您不能将 "months" 与 Duration
一起使用,因为一个月的长度会有所不同。
Period
- 另一个常见的 TemporalAmount
实现 - 分别代表年、月和日。
我个人会推荐:
- 如果您事先知道单位,请使用适当的
plusXxx
方法,例如time.plusMinutes(10)
。这几乎是最容易阅读的。 - 当您尝试表示 "logical" 日历金额时,请使用
Period
- 当您尝试表示 "fixed length" 金额时,请使用
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]
}
}
除非您确实需要,否则我不会担心效率 - 此时您应该有一个基准,以便您可以测试不同的选项。