以十进制格式转换小时数

时间:2014-07-14 21:53:44

标签: java

我已经尝试过这个问题的多种解决方案,但我似乎无法得到它。

我有十进制格式的时间,这是几个小时。我希望通过将其更改为DD:HH:MM:SS格式来使其更清晰。

实施例

10.89小时== 10小时53分40秒

编辑:10.894945454545455 == 10小时53分40秒

我尝试过的事情:

int hours = (int) ((finalBuildTime) % 1);
int minutes = (int) ((finalBuildTime * (60*60)) % 60);
int seconds = (int) ((finalBuildTime * 3600) % 60);

return String.format("%s(h) %s(m) %s(s)", hours, minutes, seconds);

返回了:0(h) 41(m) 41(s)

有什么建议吗?

6 个答案:

答案 0 :(得分:7)

  1. 几分钟内无需模块化。
  2. 您的分钟计算应该乘以60,而不是(60 * 60)

    double finalBuildTime = 10.89;
    int hours = (int) finalBuildTime;
    int minutes = (int) (finalBuildTime * 60) % 60;
    int seconds = (int) (finalBuildTime * (60*60)) % 60;
    
    System.out.println(String.format("%s(h) %s(m) %s(s)", hours, minutes, seconds));
    
  3. 此代码为您提供正确的输出

    10(h) 53(m) 24(s)
    

    我相信你预期的40秒输出是不正确的。它应该是24秒。

    (53*60 + 24)/(60*60) = 0.89
    

答案 1 :(得分:2)

这是一个完整的实现:

package test.std.java;

public class Test {

    public static void main(String[] args) {
        System.out.println(GetReadableTime(10.89));
    }

    //Prints outs HH:MM:SS
    public static String GetReadableTime(double finalBuildTime){

        int hours = (int) Math.floor(finalBuildTime);
        int remainderInSeconds = (int)(3600.0* (finalBuildTime - Math.floor(finalBuildTime)) );
        int seconds = remainderInSeconds % 60;
        int minutes = remainderInSeconds / 60;
        return  String.format("%02d:%02d:%02d", hours, minutes, seconds); 
    }
}

答案 2 :(得分:2)

rgettman的第一部分是真的:

float finalBuildTime = 10.89;
int hours = (int) finalBuildTime; // 10 ok

但是(int)((10.89 *(60 * 60))/ 60)= 683这不是你想要的:它是finalBuildTime在几分钟内的直接转换

int minutes = (int) ((finalBuildTime - hours) * 60); // 53 ok
int seconds = (int) ((finalBuildTime - hours) * 3600 - minutes * 60 + 0.5); // 24 ok

我为秒计算添加了0.5,以舍入到最接近的秒而不是截断。对于您的示例,它没有用,因为您的时间是整数秒。

秒数 24 seconds = 0.4 minutes

答案 3 :(得分:2)

我假设finalBuildTime是一个双精度数。你必须这样做:

int hours = (int)finalBuildTime;
int minutes = (int)((finalBuildTime - hours) * 60);
int seconds = (int)((((finalBuildTime - hours) * 60) - minutes ) * 60);

答案 4 :(得分:1)

  1. (int)向下舍入。因此,(int)(finalBuildTime)给你几个小时。

  2. 由于60次60是3600,因此您的秒数和分钟数相同。

  3. 为了找到分钟和秒钟,我会发现你的例子里的10.89小时是10小时0.89小时。我首先计算在0.89小时内的分钟数。(小数点后的部分)那将是0.89乘以60.再次,因为这个数字应该总是小于60,所以将数字转换(因此,向下舍入)为(int)给你分钟。因此,对于分钟,它是int minutes =(int)((finalBuildTime-hours)* 60);

  4. 您可以保留其余代码。

答案 5 :(得分:1)

其他答案是正确的,但是如果它对您(或其他偶然发现的人)有帮助,那么使用像Joda-Time这样的库来实现这一点要容易得多。以下是使用Joda-Time 2.3解决问题的方法:

double buildDurationInHours = 10.89;
long buildDurationInMilliseconds = new Double(DateTimeConstants.MILLIS_PER_HOUR * buildDurationInHours).longValue();
Period period = new Period(buildDurationInMilliseconds);
System.out.println("The build took "
        + period.getDays() + " days, "
        + period.getHours() + " hours, "
        + period.getMinutes() + " minutes, and "
        + period.getSeconds() + " seconds.");

输出:

The build took 0 days, 10 hours, 53 minutes, and 24 seconds.

这样您就不必直接处理小时,分钟,秒等的计算。