【问题标题】:How to sum two times in Java, using LocalTime?如何使用 LocalTime 在 Java 中求和两次?
【发布时间】:2022-02-10 03:10:41
【问题描述】:

例子:

LocalTime time1 = LocalTime.of(12, 30);
LocalTime time2 = LocalTime.of(8, 30);
time1 + time2   // Doesn't work.
time1.plus(time2)   // Doesn't work.

我想以(小时:分钟)的格式获得两次(12:30 + 8:30 = 21:00)的总和。

还有其他建议吗?

【问题讨论】:

  • 两次相加时你期望什么?
  • 您只想将 time2 的小时数和分钟数添加到 time1 吗?
  • 您可以将Duration 对象加在一起——它们代表了一段时间。您可以将Duration 添加到LocalDate。您不能添加两个日期 - 这绝对没有意义......
  • @Pshemo A LocalTime 不是日期,而是一天中的时间(小时、分钟、秒)。
  • @Jesper 哦,你是对的,我把它误读为 LocalDate。无论如何,问题仍然是相似的:OP 期望什么结果以及为什么?

标签: java java-8 sum localtime


【解决方案1】:

您正在尝试添加两个 LocalTime 变量。这是一个错误的概念。您的 time2 不应该是 LocalTime,而应该是 Duration。添加到时间的持续时间会给您另一个时间。从时间中减去时间会给你一个持续时间。这一切都很好而且合乎逻辑。两次相加不是。

通过一些黑客攻击可以将您的时间转换为持续时间,但我强烈建议您不要这样做。相反,重组你的代码,让 time2 首先是一个Duration

【讨论】:

    【解决方案2】:

    您可以执行以下操作...

    LocalTime t1 = LocalTime.of(9, 0);  // 09:00
    LocalTime t2 = LocalTime.of(2, 30); // 02:30
    LocalTime total = t1.plusHours(t2.getHour())
                        .plusMinutes(t2.getMinute());  // 11:30
    

    【讨论】:

      【解决方案3】:

      Mike Nakis 的回答不正确。

      我上面那句话不是真的。我已经检查过,只有 Java 8 有 LocalTime.of 所以 Mike Nakis 的回答是完全正确的。请看他的回答。

      [此部分仍保留。以防 LocalTime 在 joda 图书馆]

      我会解释:

      Joda-Time 中的

      持续时间 表示以毫秒为单位的持续时间。持续时间通常是从一个间隔中获得的。即我们 可以从间隔的末尾减去 start 以得出持续时间。

      A period 在 Joda-Time 中表示以字段定义的时间段,例如 3 年 5 个月 2 天 7 小时。这个 与持续时间的不同之处在于它在以下方面是不精确的 毫秒。一个时期只能被解析为一个确切的数字 毫秒通过指定瞬间(包括年表和时间 zone) 它是相对的。例如考虑 1 年,如果我们添加 这到 1 月 1 日,我们总是会在下一个 1 月 1 日到达,但是 持续时间将取决于中间年份是否是闰年 一年与否。

      LocalTime 是一个不可变的时间类,表示一个时间没有时区。因此,根据上述定义,句号适合您向LocalTime 添加时间。事实上,API 已经证明了这一点:

      LocalTime localTime = new LocalTime(10, 30);
      Duration d = new Duration(1, 0);
      Period p = new Period(1, 0);
      LocalTime newLocalTime = localTime.plus(d); // COMPILE ERROR
      LocalTime newLocalTime = localTime.plus(p); // SUCCESS
      

      【讨论】:

      • @MikeNakis 对不起。我再次投票赞成您的回答(我需要编辑,以便再次投票,哈哈)。很抱歉我没有仔细看到原始问题。
      【解决方案4】:

      你可以使用方法 sum()

      LocalTime time1 = LocalTime.of(12, 30);
      LocalTime time2 = LocalTime.of(8, 30);
      Integer hour1 = time1.getHour();
      Integer hour2 = time2.getHour();
      Integer minute1 = time1.getMinute();
      Integer minute2 = time2.getMinute();
      
      Integer first = Integer.sum(hour1,hour2);
      Integer second = Integer.sum(minute1,minute2);
      
      System.out.println("The time is "+ first + " : " + second);
      

      它必须工作

      【讨论】:

        【解决方案5】:
        LocalTime t1 = LocalTime.parse('03:33:24')
        LocalTime t2 = LocalTime.parse('03:13:41')
        
        t1.plusHours(t2.hour)
          .plusMinutes(t2.minute)
          .plusSeconds(t2.second)
          .plusNanos(t2.nano)
        

        【讨论】:

          猜你喜欢
          • 2020-08-01
          • 2019-04-14
          • 2018-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-16
          • 2023-03-30
          相关资源
          最近更新 更多