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#toHours
returns一个long
。您只能将其视为 4.0
因为您将其存储为 float
并且它会被隐式转换。
您希望通过 Duration#toMinutesPart
将分钟部分除以 60(如 float
)并将其添加到小时中:
System.out.println((dur.toHours() + dur.toMinutesPart()/60f)); // prints 4.75
请注意,当日历发生变化并且小时没有 60 秒时,这将失效。世界上有许多一分钟没有 60 秒的例子——首先想到的是闰秒,还有其他。所以建议显示4:45
这种时间,不要转成小数。
[...] 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
您必须除以 double
或 float
,否则您将得到整数除法。
这很好用。
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一个长数。
我想要日期之间以小时为单位的确切持续时间。 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#toHours
returns一个long
。您只能将其视为 4.0
因为您将其存储为 float
并且它会被隐式转换。
您希望通过 Duration#toMinutesPart
将分钟部分除以 60(如 float
)并将其添加到小时中:
System.out.println((dur.toHours() + dur.toMinutesPart()/60f)); // prints 4.75
请注意,当日历发生变化并且小时没有 60 秒时,这将失效。世界上有许多一分钟没有 60 秒的例子——首先想到的是闰秒,还有其他。所以建议显示4:45
这种时间,不要转成小数。
[...] 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
您必须除以 double
或 float
,否则您将得到整数除法。
这很好用。
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一个长数。