从分钟计算的星期、小时、分钟



显示总分钟数中的日、小时和分钟的要求如下:

我正在从硬件设备获取分钟数。

6050 分钟显示为:4d 5h(它是 4 天 4 小时 50 分钟,50 分钟我们四舍五入到 1 小时)

6090 分钟显示为:4d 6h(它是 4 天 5 小时 30 分钟,30 分钟我们四舍五入为 1 小时)

6089 分钟显示为4d 5h(它是 4 天 5 小时 29 分钟,29 分钟我们四舍五入为 0 小时)

其他需要注意的是 0d 0h,0m应显示为0m

还有一件事是:如果总小时数> 100,它应该不显示分钟。

到目前为止,我试图实现如下,但没有得到正确的输出:

fun minutesToDaysHoursMinutes(time: Double): String? {
val hourFromMinute: Double = time * 60.0
val d: Duration = Duration.ofMinutes(time.toLong())
val days: Long = d.toDays()
val hours: Long = d.toHours() % 24
val minutes: Long = d.toMinutes() % 60
if (hourFromMinute > 100) {
if (minutes >= 30) {
if (days == 0L && hours != 0L) {
return String.format("%2dh", hours)
}
if (days != 0L && hours == 0L) {
return String.format("%2dd", days)
}
return String.format("%2dd %2dh", days, (hours + 1))
} else {
if (days == 0L && hours != 0L) {
return String.format("%2dh", hours)
}
if (days != 0L && hours == 0L) {
return String.format("%2dd", days)
}
if (days == 0L && hours == 0L) {
return String.format("%2dm", minutes)
}
return String.format("%2dd %2dh", days, hours)
}
} else {
var stringDays = "" + days
if (stringDays.toInt()<=0) {
stringDays = ""
} else {
stringDays = stringDays + "d"
}
var stringHours = "" + hours
if (stringHours.toInt()<=0) {
stringHours = ""
} else {
stringHours = stringHours + "h"
}
var stringMinutes = "" + minutes
if (stringMinutes.toInt()<=0) {
stringMinutes = "0m"
} else {
stringMinutes = stringMinutes + "m"
}
return stringDays + " " + stringHours + " " + stringMinutes
}

我可以显示正确的值,但是有没有更好的方法可以这样做? 谢谢。

嗯,你有很多 if 语句,其中重复了大致相同的代码。此外,您的minutesToDaysHoursMinutes方法正在执行两项操作:舍入和格式化输出。

我认为你应该把这两个责任分成两种不同的方法。

四舍五入

首先,您可以按如下方式进行创始:

Duration roundFromMinutesToHours(double minutes) {
var duration = Duration.ofMinutes((long) minutes);
long hoursToAdd = (duration.toMinutesPart() < 30 ? 0 : 1);
return duration.truncatedTo(ChronoUnit.HOURS).plusHours(hoursToAdd);
}

此方法接受分钟数,然后向上或向下舍入为小时,丢弃分钟值。请注意,此方法使用Duration::toMinutesPart,自 Java 9 以来一直可用。toMinutesPart不会像toMinutes()那样返回分钟数,而是返回小时内的分钟数。请注意,此方法返回一个具有舍入到整小时值的Duration

现在你有一个很好的四舍五入的持续时间,你可以在下面的方法中使用。

格式

然后,您可以按如下方式编写Duration的格式:

String formatDuration(Duration duration) {
if (duration.isZero()) {
return "0m";
}
var result = String.format("%sd %sh", duration.toDays(), duration.toHoursPart());
if (duration.toHours() <= 100) {
result += " 0m";
}
return result;
}

如果持续时间为 0(因此原始<30 分钟),则返回"0m"。否则,返回"x d y h"或"x d yh z m",其中xyz分别是天、小时和分钟,具体取决于总小时数是否大于 100。

最新更新