【问题标题】:What is the difference of using TemporalAmount or TemporalUnit in Java 8?在 Java 8 中使用 TemporalAmount 或 TemporalUnit 有什么区别?
【发布时间】:2015-05-11 20:31:09
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: java datetime java-8 java-time


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-12
      • 2018-06-19
      • 2017-01-18
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多