我有一个java.util.Date对象数组。我想找到平均值。
例如,如果我在上午7:40和上午7:50有2个日期对象。我应该得到一个平均日期对象7:45 AM。
我想到的方法效率低下:
这样做有更简单的功能吗?
答案 0 :(得分:20)
从根本上说,你可以在Unix时代之后加上" millis"在所有Date
个对象中找到它们的平均值。现在棘手的一点是避免溢出。选项包括:
BigInteger
代替方法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);