繁体   English   中英

在Java中以(hh mm ss)格式查找平均时间

[英]Find average of time in (hh mm ss) format in java

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

您当前的代码不正确,例如尝试使用输入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);
}

使用DateSimpleDateFormatJoda将使代码更易于理解,但我认为它没有比这更有效的方法,因为此代码严格执行您想做的事情,即平均以60为底的数字。

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

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

Java API中没有单一方法可以解决此问题。 但是有些方法会有所帮助。

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

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

可以使用SimpleDateFormat类或第三方Joda时间类库解决将时间字符串转换为数字并将数字转换为时间字符串的问题。 或者,您可以手动提取小时/分钟/秒部分,将每个部分转换为整数,然后计算秒数。

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


为了记录在案,您不能像当前代码所尝试的那样平均三个分量的平均值,以得出3次平均值。 这没有数学意义。

这样的事情应该起作用:

        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之后,您可以执行各种操作。

检查简单日期格式日期

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM