【问题标题】:Java Duration error from a day to anotherJava Duration 错误从一天到另一天
【发布时间】:2018-03-01 14:51:05
【问题描述】:

我发现了一个使用 Java Duration 的非常简单的问题。

     LocalTime SaturdayStart = LocalTime.of(22, 30); 
     LocalTime SaturdayEnd = LocalTime.of(01, 00);
     System.out.println(SaturdayStart);
     System.out.println(SaturdayEnd);
     System.out.println(Duration.between(SaturdayStart, SaturdayEnd));

这段代码的输出是:

22:30
01:00
PT-21H-30M

这就是问题所在。我希望持续时间不是 21H,而是 2H-30M。是什么导致该方法无法看到两次之间的“天变化”?

【问题讨论】:

  • LocalTime 没有一天,这就是为什么它的名称中只有“时间”。在 LocalTime 的上下文中根本不存在像一天这样的变化。
  • 也许你正在寻找LocalDateTime
  • 返回的不是 21H,而是 MINUS 21H, 22:30 和 01:00 之间的差异。

标签: java duration localtime


【解决方案1】:

请记住,LocalTime 只代表一个时间,一天天,没有时区。

由于它表示您在时钟上看到的一天时间,因此您不能用它来计算今天 22:30和01:00之间的差异第二天。您的两个LocalTime 对象分别代表今天 22:30 和今天 01:00。

要考虑这一天,您需要LocalDateTime。这不仅代表时间(没有时区),而且代表 ISO-8601 日历系统中的日期。您可以像这样创建两个 LocalDateTime 对象:

LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.of(22, 30));
LocalDateTime end = start.plusDays(1).withHour(1).withMinute(0);

然后你可以得到持续时间:

Duration d = Duration.between(start, end);
System.out.println(d);

顺便说一句,您在错误输出中得到的 - 字符不是不同组件的分隔符。它们是负面信号。这是因为您从 01:00 减去 22:30,这就像从较小的数字中减去较大的数字,您会得到一个负数。

【讨论】:

    【解决方案2】:

    返回的Duration区间有数据,StartTime是否出现在EndTime之后,可以做进一步处理;像这样

         LocalTime SaturdayStart = LocalTime.of(22, 30); 
         LocalTime SaturdayEnd = LocalTime.of(01, 00);
         System.out.println(SaturdayStart);
         System.out.println(SaturdayEnd);
         Duration interval = Duration.between(SaturdayStart, SaturdayEnd);
         interval = interval.isNegative() ? interval.plusDays(1) : interval;
         System.out.println(interval);
    

    【讨论】:

      【解决方案3】:

      java.time.DurationISO-8601 standards 为模型,PT-21H-30M 表示持续时间为21 小时和30 分钟,其中减号表示结束时间早于开始时间。因此,除非您考虑带时间的日期并且表示日期和时间的类型为LocalDateTime,否则您无法得到您想要的。您可以选择任何日期并将其与时间相结合以获得LocalDateTime

      对于任何给定的日期,如果开始时间晚于结束时间,则将结束日期时间重置为午夜,然后添加一天,最后将其时间设置为结束时间。

      一旦有了持续时间,您就可以通过获取小时、分钟、秒等来创建格式化字符串。 Java-9 引入了一些更方便的方法,使其更容易。

      演示:

      import java.time.Duration;
      import java.time.LocalDate;
      import java.time.LocalDateTime;
      import java.time.LocalTime;
      
      public class Main {
          public static void main(String[] args) {
              LocalDate today = LocalDate.now();
              LocalTime startTime = LocalTime.of(22, 30);
              LocalTime endTime = LocalTime.of(01, 00);
      
              LocalDateTime startDateTime = today.atTime(startTime);
              LocalDateTime endDateTime = today.atTime(endTime);
      
              if (startDateTime.isAfter(endDateTime)) {
                  endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
              }
      
              Duration duration = Duration.between(startDateTime, endDateTime);
              // Default format
              System.out.println(duration);
      
              // Custom format
              // ####################################Java-8####################################
              String formattedDuration = String.format("%dH-%dM-%dS", duration.toHours(), duration.toMinutes() % 60,
                      duration.toSeconds() % 60);
              System.out.println(formattedDuration);
              // ##############################################################################
      
              // ####################################Java-9####################################
              formattedDuration = String.format("%dH-%dM-%dS", duration.toHoursPart(), duration.toMinutesPart(),
                      duration.toSecondsPart());
              System.out.println(formattedDuration);
              // ##############################################################################
          }
      }
      

      输出:

      PT2H30M
      2H-30M-0S
      2H-30M-0S
      

      【讨论】:

        猜你喜欢
        • 2017-09-22
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多