从分钟计算天、小时、分钟

Day, Hour, Min Calculation from the Minutes

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

我正在从硬件设备获取会议记录。

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 不 return 总数 分钟,如 toMinutes(),但 return 是一小时 内的分钟数 。请注意,此方法 return 是一个 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 分钟),则 return“0 分钟”。否则,return "xd yh" 或 "xd yh zm",其中 xyz分别为天数、小时数和分钟数,根据总小时数是否大于100。