我想用hh:mm:ss格式计算三次的平均值。我尝试了以下代码。
public String calculateAverageOfTime()
{
String timeInHHmmss = "08:00:00 08:00:00 08:00:00";
String[] split = timeInHHmmss.split(" ");
long hh = 0,mm = 0,ss = 0;
for (int i = 0; i < split.length; i++)
{
String[] split1 = split[i].split(":");
hh += Long.valueOf(split1[0].trim());
mm += Long.valueOf(split1[1].trim());
ss += Long.valueOf(split1[2].trim());
}
hh = hh / split.length ;
mm = mm / split.length ;
ss = ss / split.length ;
String hms = String.format("%02d:%02d:%02d", hh,mm,ss);
return hms;
}
此代码效果很好。有没有有效的方法来做到这一点? 。 Java API中可用的任何方法。
答案 0 :(得分:3)
您当前的代码不正确,请尝试使用输入08:00:00 08:00:00 09:30:00
。正如@StephenC所说,你不能平均时间平均小时,分钟,秒组件。时间就像基数为60的数字,你知道,60秒+ 1 = 1:00而不是61。
这是正确的,计算秒的总和,然后取平均值并转换回时间:
public static String calculateAverageOfTime(String timeInHHmmss) {
String[] split = timeInHHmmss.split(" ");
long seconds = 0;
for (String timestr : split) {
String[] hhmmss = timestr.split(":");
seconds += Integer.valueOf(hhmmss[0]) * 60 * 60;
seconds += Integer.valueOf(hhmmss[1]) * 60;
seconds += Integer.valueOf(hhmmss[2]);
}
seconds /= split.length;
long hh = seconds / 60 / 60;
long mm = (seconds / 60) % 60;
long ss = seconds % 60;
return String.format("%02d:%02d:%02d", hh,mm,ss);
}
使用Date
,SimpleDateFormat
或Joda
会让代码更容易理解,但我认为它不会比这更有效,因为这段代码严格遵循你的要求我想这样做,这是一个基数为60的数字。
正如其他人所指出的那样,请注意平均时的精度损失。
您可能还想验证输入字符串的格式是否正确,否则算法会中断。
答案 1 :(得分:1)
Java API中没有单一方法可以解决此问题。但也有一些会有所帮助。
您需要做的是将问题分解为部分:
使用SimpleDateFormat
类或第三方Joda时间类库可以解决将时间字符串转换为数字和数字转换为时间字符串的问题。或者您可以手动提取小时/分钟/秒组件,将每个组件转换为整数,然后计算秒数。
平均3个数字的问题可以通过一行Java来解决......虽然您需要注意整数除法截断结果的事实。
对于记录,不能通过对其三个组件求平均值平均3次,就像当前代码尝试的那样。它没有数学意义。
答案 2 :(得分:1)
这样的事情应该有效:
String timeInHHmmss = "08:00:00 08:00:00 08:00:00";
String[] split = timeInHHmmss.split(" ");
long sum = 0L;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
for (int i = 0; i < split.length; i++)
{
sum += sdf.parse(split[i]).getTime();
}
Date avgDate = new Date((sum/split.length));
System.out.println("avg Date is:"+sdf.format(avgDate));
转换为java.util.Date,然后您可以执行各种操作。