我已经尝试过这个问题的多种解决方案,但我似乎无法得到它。
我有十进制格式的时间,这是几个小时。我希望通过将其更改为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)
有什么建议吗?
答案 0 :(得分:7)
您的分钟计算应该乘以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));
此代码为您提供正确的输出
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)
(int)向下舍入。因此,(int)(finalBuildTime)给你几个小时。
由于60次60是3600,因此您的秒数和分钟数相同。
为了找到分钟和秒钟,我会发现你的例子里的10.89小时是10小时0.89小时。我首先计算在0.89小时内的分钟数。(小数点后的部分)那将是0.89乘以60.再次,因为这个数字应该总是小于60,所以将数字转换(因此,向下舍入)为(int)给你分钟。因此,对于分钟,它是int minutes =(int)((finalBuildTime-hours)* 60);
您可以保留其余代码。
答案 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.
这样您就不必直接处理小时,分钟,秒等的计算。