SOLUTION:
double durH = dur.toHours()/60.0;
问题是,正如我所提到的,我被一个整数除。即使我将其保存为浮点数/长整型,它也被除法转换,导致数字被除去了小数点。
原始帖子:
我想要确切的时间间隔(以小时为单位)。方法之间似乎只考虑整个小时的差异。为什么会这样,我该怎么做/使用呢?
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);
OUTPUT:
4.0
WHAT I WANT:
4.75
似乎无效的建议:
long durH = dur.toMinutes()/60;
^返回4.0
这很好用。
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()
为单位的更精确的值,然后将其以float形式通过div“投射”为小时Duration.ofHours(1).toMinutes()
。
尝试:(float) duration.toMinutes() / Duration.ofHours(1).toMinutes()
U需要在除法之前进行浮点运算,如下所示:
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()返回一个长数字。
Duration#toHours
返回long
。您仅将其视为4.0
,因为您将其存储为float
,并且隐式转换了它。
您希望它通过Duration#toMinutesPart
来记录分钟,将其除以60(作为float
),然后将其加到小时中:
System.out.println((dur.toHours() + dur.toMinutesPart()/60f)); // prints 4.75
请注意,当日历中有班次且小时没有60秒时,此功能将失效。世界上有很多实例,一分钟没有60秒-首先想到的是leap秒,还有其他一些实例。因此,建议将这些时间显示为4:45
,而不要将其转换为小数。
[...]通过将秒数除以3600,返回持续时间的总小时数。
当方法返回结果为Duration#toHours
时,小数部分被切除。
您可以通过明确地执行相同的操作来获得小数部分。
long
请注意,您必须用Duration dur = Duration.between(
LocalDateTime.of(2020, 5, 20, 12, 00), LocalDateTime.of(2020, 5, 20, 16, 45));
long durationSeconds = dur.toSeconds();
double durationHours = durationSeconds / (3600.0);
System.out.println(durationHours);
或double
来表示,否则必须用整数除法。