获取两个java.util.Date的平均值

时间:2013-08-12 17:35:52

标签: java date

我有一个java.util.Date对象数组。我想找到平均值。

例如,如果我在上午7:40和上午7:50有2个日期对象。我应该得到一个平均日期对象7:45 AM。

我想到的方法效率低下:

  1. for循环所有日期
  2. 找出0000和时间之间的差异
  3. 将时间差异添加到总计
  4. 除以总计数
  5. 将该时间转换为日期对象
  6. 这样做有更简单的功能吗?

6 个答案:

答案 0 :(得分:20)

从根本上说,你可以在Unix时代之后加上" millis"在所有Date个对象中找到它们的平均值。现在棘手的一点是避免溢出。选项包括:

  1. 除以某些已知数量(例如1000)以避免溢出;这会将准确度降低一个已知的数量(在这种情况下会降低到第二个)但如果你的物品数量超过1000个则会失败
  2. 将每个millis值除以您平均的日期数;这将始终有效,但难以理解准确度降低
  3. 使用BigInteger代替
  4. 方法1的一个例子:

    long totalSeconds = 0L;
    for (Date date : dates) {
         totalSeconds += date.getTime() / 1000L;
    }
    long averageSeconds = totalSeconds / dates.size();
    Date averageDate = new Date(averageSeconds * 1000L);
    

    方法3的一个例子:

    BigInteger total = BigInteger.ZERO;
    for (Date date : dates) {
         total = total.add(BigInteger.valueOf(date.getTime()));
    }
    BigInteger averageMillis = total.divide(BigInteger.valueOf(dates.size()));
    Date averageDate = new Date(averageMillis.longValue());
    

答案 1 :(得分:1)

有很多日期,把所有日期的总和放在一起肯定会溢出。如果你想阻止你这样做(伪代码):

var first = dates.getFirst
var sumOfDifferences = 0
loop over all dates
    for each date sumOfDifferences += date - first
var averageDate = first + sumOfDifferences/countOfDates

这绝不会让你在溢出中运行。

答案 2 :(得分:0)

这里已有答案:Sum two dates in Java

您只需要使用getTime()汇总所有日期对象,然后将其除以对象数并将其转换回Date对象。完成。

答案 3 :(得分:0)

为了避免平均时间的计算过剩:

首先按日期排序;
将第一个日期的值存储在time0;

从所有时间开始减去第一次减去0的deltaTimes的平均值。 然后总结并划分。

结果= new Date(time0 + avgDeltas);

答案 4 :(得分:0)

试试这个。在这里,每个日期转换为长值my getTime()。这将返回mil-second值。然后我们就可以继续了。

   SimpleDateFormat sdf = new SimpleDateFormat("HH:mma");
    Date date1=sdf.parse("7:40AM");
    Date date2=sdf.parse("7:50AM");
    long date1InMilSec=date1.getTime();
    long date2InMilSec=date2.getTime();
    System.out.println("Average "+sdf.format((date1InMilSec+date2InMilSec)/2));

答案 5 :(得分:0)

发布java 8后,您可以使用

Date avgDate = new Date( LongStream.of(datesAsLongArray).sum() / datesAsLongArray.length * 1000);
相关问题