Duration.between() 无法按照我想要的方式工作

Duration.between() doesn't work the way I want to

我想要日期之间以小时为单位的确切持续时间。 between-方法似乎只考虑整小时的差异。为什么会这样,我可以 do/use 做什么?

Duration dur = Duration.between(
    LocalDateTime.of(2020, 5, 20, 12, 00), LocalDateTime.of(2020, 5, 20, 16, 45));

float durH = dur.toHours(); 

System.out.println(durH);

这段代码给了我 4.0 但我想要的是 4.75.

Duration#toHoursreturns一个long。您只能将其视为 4.0 因为您将其存储为 float 并且它会被隐式转换。

您希望通过 Duration#toMinutesPart 将分钟部分除以 60(如 float)并将其添加到小时中:

System.out.println((dur.toHours() + dur.toMinutesPart()/60f)); // prints 4.75

请注意,当日历发生变化并且小时没有 60 秒时,这将失效。世界上有许多一分钟没有 60 秒的例子——首先想到的是闰秒,还有其他。所以建议显示4:45这种时间,不要转成小数。

方法Duration#toHours

[...] returns the total number of hours in the duration by dividing the number of seconds by 3600.

作为方法returns结果为long,小数部分被截去。

您可以通过显式执行相同的操作来获取小数部分:

Duration dur = Duration.between(
    LocalDateTime.of(2020, 5, 20, 12, 00), LocalDateTime.of(2020, 5, 20, 16, 45));

double durH = dur.toSeconds() / 3600.0;

System.out.println(durH); // gives 4.75

您必须除以 doublefloat,否则您将得到整数除法。

这很好用。

double durH = dur.toMinutes()/60.;
// or
double durH = dur.toMinutes()/60.f;

System.out.println(durH);

打印

4.75
Duration duration = Duration.between(LocalDateTime.of(2020, 5, 20, 12, 00), LocalDateTime.of(2020, 5, 20, 16, 45));    
float hourWithDecimals = (float) duration.toMinutes() / Duration.ofHours(1).toMinutes();

System.out.println(hourWithDecimals);

在分钟内获得更精确的值 duration.toMinutes(),通过 Duration.ofHours(1).toMinutes().

在不使用任何幻数的情况下将其“投射”到小时

尝试:(float) duration.toMinutes() / Duration.ofHours(1).toMinutes()

你需要在除法之前强制转换为浮动,如下所示:

public static void main(String[] args) {

    Duration dur = Duration.between(LocalDateTime.of(2020, 5, 20, 12, 00), LocalDateTime.of(2020, 5, 20, 16, 45));

    double durh = (double)dur.toMinutes()/60;

    System.out.println(durh);
}

因为dur.toMinutes() return一个长数。