1

我想以 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 中可用的任何方法。

4

3 回答 3

3

您当前的代码不正确,例如尝试使用 input 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, SimpleDateFormatorJoda会使代码更易于理解,但我认为它不会比这更有效,因为此代码严格执行您想要做的事情,即平均一个以 60 为基数的数字。

正如其他人指出的那样,请注意平均时的精度损失。

您可能还想验证输入字符串的格式是否正确,否则算法将中断。

于 2013-10-12T07:07:33.820 回答
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 之后就可以进行各种操作了。

检查简单日期格式日期

于 2013-10-12T06:49:08.397 回答
1

Java API 中没有一种方法可以解决这个问题。但有一些会有所帮助。

您需要做的是将问题分解为多个部分:

  • 将时间字符串转换为数字。
  • 平均数字
  • 将平均值转换回时间字符串。

时间字符串转数字、数字转时间字符串的问题可以使用SimpleDateFormat类解决,也可以使用3rd-party Joda时间类库。或者您可以手动提取小时/分钟/秒分量,将每个分量转换为整数,然后计算秒数。

平均 3 个数字的问题可以用一行 Java 来解决……尽管您需要注意整数除法会截断结果的事实。


作为记录,您不能像当前代码尝试做的那样,通过平均它们的三个组件来平均 3 次。这在数学上没有意义。

于 2013-10-12T06:42:43.037 回答