Java 以十进制格式转换小时数

Java 以十进制格式转换小时数,java,Java,我试过多种方法来解决这个问题,但似乎都不明白 我有十进制的时间,单位是小时。我希望通过将其更改为DD:HH:MM:SS格式,使其更加清晰 例子: 10.89小时=10小时53分40秒 编辑:10.8949455==10小时53分40秒 我所尝试的: 返回:0(h)41(m)41(s) 有什么建议吗 (int)四舍五入。因此,(int)(finalBuildTime)为您提供小时 因为60乘以60等于3600,所以秒和分钟的计算是相同的 为了找出分和秒,我会观察到你的例子中的10.89小时是10小

我试过多种方法来解决这个问题,但似乎都不明白

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

例子: 10.89小时=10小时53分40秒

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

我所尝试的: 返回:
0(h)41(m)41(s)

有什么建议吗

  • (int)四舍五入。因此,(int)(finalBuildTime)为您提供小时

  • 因为60乘以60等于3600,所以秒和分钟的计算是相同的

  • 为了找出分和秒,我会观察到你的例子中的10.89小时是10小时和0.89小时。我首先计算0.89小时内的分钟数(小数点后的部分),即0.89乘以60。同样,由于该数字应始终小于60,因此将该数字转换(因此,四舍五入)为(int)会给您几分钟的时间。因此,对于分钟,它是int minutes=(int)((finalBuildTime hours)*60)

  • 您可以保留其余的代码


  • 下面是一个完整的实现:

    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); 
        }
    }
    

    第一部分是真的:

    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秒=0.4分钟

    其他答案都是正确的,但如果它能帮助你(或其他人)使用这样的库会容易得多。以下是使用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.
    

    通过这种方式,您不必直接计算小时、分钟、秒等。

    我假设finalBuildTime是双精度的。你只需要做:

    int hours = (int)finalBuildTime;
    int minutes = (int)((finalBuildTime - hours) * 60);
    int seconds = (int)((((finalBuildTime - hours) * 60) - minutes ) * 60);
    
  • 没有必要对分钟进行模块化
  • 你对分钟的计算应该只乘以60,而不是(60*60)

  • 此代码为您提供了正确的输出

    10(h) 53(m) 24(s)
    
    我认为您预期的40秒输出是不正确的。应该是24秒

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

    虽然我喜欢使用Joda Time的建议,但为了让这个问题帮助用户,您需要帮助他将十进制数转换为毫秒。@JustinKSU True,我将在中编辑它。同样,Joda Time通过提供
    DateTimeConstants.MILLIS\u PER\u HOUR
    来帮助实现这一点。谢谢你的反馈。看起来不错。与其使用BigDecimal,为什么不使用Double类呢?新的双精度(DateTimeConstants.MILLIS_/u HOUR*buildDurationInHours).longValue();我相信(int)finalBuildTime相当于(int)Math.floor(finalBuildTime)。此外,在计算秒数时,你可以参考可变的小时数,而不是再次进行发言。当然,绝对同意。它只是让新手更容易理解。。。使截断部分更加明确。另一个很好的答案。还有助于您“拼写”计算。从小时到小数的反向转换过程是什么样的?谢谢您的回答!我交叉引用输出的“未仲裁”时间似乎被弄乱了,导致了24秒和40秒之间的差异。尽管如此,你的解决方案是正确的。实际上,我自己只是仔细检查了这些计算。实际的双精度是10.8949455,实际上应该是10h 53m 41s。如何应用逆向工程???例如:输入:2:30预期输出:2。5@zod如果你往上看,我从来没有说过。89是89分钟。逐字复制:“10.89小时==10小时53分40秒”这是另一个伟大的解决方案。注意:分钟计算结束时缺少分号。对不起,吹毛求疵。如果有人无意中发现这一点,请提前思考。
    10(h) 53(m) 24(s)
    
    (53*60 + 24)/(60*60) = 0.89