【问题标题】:How to avoid negative time between time difference?如何避免时差之间的负时间?
【发布时间】:2017-11-07 07:56:02
【问题描述】:

我正在开发一个使用 Java8 Time 的应用程序。我遇到了一个问题。

假设时间 A 是 08:00,时间 B 是 17:00,所以这两个时间之间的差异将是 9 小时,在我的情况下这是正确的,但是如果时间 A 是 18:00 而时间 B 是 02 :00 它应该是 8h,但在我的情况下,我的程序返回 -16。请有人指导我如何解决这个问题。

我的代码:

@Test
public void testTime()
{
    DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");

    String s = "18:00";
    String e = "02:00";

    // Parse datetime string to java.time.LocalDateTime instance
    LocalTime startTime = LocalTime.parse(s, format);
    LocalTime endTime = LocalTime.parse(e, format);

    String calculatedTime = ChronoUnit.HOURS.between(startTime, endTime)%24 + ":"
            + ChronoUnit.MINUTES.between(startTime, endTime)%60;

    System.out.println(calculatedTime);

}

【问题讨论】:

  • 使用Math.abs ?
  • 差异计算是正确的,实际上,我会说这是你如何使用它的问题。单独使用时间几乎没有价值,对于LocalTime,说 18:00 和 2:00 之间有 -16 小时是正确的。你需要的是一个LocalDateTime的实例,并正确设置LocalDate,然后你就可以进行正确的计算了。
  • @M.Prokhorov 请将答案放在答案部分。
  • Math.abs 无济于事,OP 正在处理字符串
  • @ErwinBolwidt Math.abs 是错误的使用方法。他需要模 24 运算,结果在 0 到 23 之间。示例:从 23:00 到 02:00 的时间是 -21 小时或 3 小时,但肯定不是 21 小时。

标签: java time java-8 java-time localtime


【解决方案1】:

为什么不使用Duration 类?它适用于像您这样的情况。

    Duration calculatedTime = Duration.between(startTime, endTime);
    if (calculatedTime.isNegative()) {
        calculatedTime = calculatedTime.plusDays(1);
    }

    System.out.println(calculatedTime);

这会以 ISO 8601 格式打印持续时间:

PT8H

在 Java 8 中格式化:

    long hours = calculatedTime.toHours();
    calculatedTime = calculatedTime.minusHours(hours);
    String formattedTime = String.format(Locale.getDefault(), "%d:%02d",
                                         hours, calculatedTime.toMinutes());
    System.out.println(formattedTime);

打印出来

8:00

在 Java 9 中格式化(未测试):

    String formattedTime = String.format("%d:%02d", 
                                         calculatedTime.toHoursPart(),
                                         calculatedTime.toMinutesPart());

【讨论】:

    【解决方案2】:

    如果时间差为负数,则加 24。

    简单!

    (显然,这将忽略夏令时的夜间更改,因此您最好的选择是使用持续时间对象正确执行此操作。话虽如此,但您需要了解与两次相关的日期的更多信息.)

    【讨论】:

    • @ΦXocę웃Пepeúpaツ 阅读:“如果时差为负”。 02:00 既不是负数,也不是 OP 示例中的差异。
    【解决方案3】:

    您必须以 24 为模计算时间差。 所以像你已经做的那样取差,然后以24为模计算它。请注意,在 Java 中,-16%24 将返回 -16,因此您真正需要做的是:

    public static int modulus(int n, int m){
        return  (n < 0) ? (m - (Math.abs(n) % m) ) %m : (n % m);
    }
    

    它总是返回一个肯定的结果。

    【讨论】:

    • 你是什么?为什么不加 24 并以 24 为模计算结果?
    • 在这种情况下添加 24 可以正常工作。但该功能更通用。想象一下像-251 这样的数字,加上 24 不会产生正数。
    【解决方案4】:

    检查 startTime is after endTime 并根据需要交换操作:

        LocalTime startTime = LocalTime.parse(s, format);
        LocalTime endTime = LocalTime.parse(e, format);
        String calculatedTimeMorning;
    
        if (startTime.isAfter(endTime)) {
            calculatedTimeMorning = (ChronoUnit.HOURS.between(endTime, startTime) % 24) + ":"
                    + (ChronoUnit.MINUTES.between(endTime, startTime) % 60);
        } else {
            calculatedTimeMorning = (ChronoUnit.HOURS.between(startTime, endTime) % 24) + ":"
                    + (ChronoUnit.MINUTES.between(startTime, endTime) % 60);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2018-08-18
      • 2018-07-24
      相关资源
      最近更新 更多