首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >得到两个java.util.Date的平均值

得到两个java.util.Date的平均值
EN

Stack Overflow用户
提问于 2013-08-12 17:35:51
回答 6查看 6K关注 0票数 6

我有一个java.util.Date对象数组。我在努力找出平均水平。

例如,如果我有两个日期对象,分别是上午7:40和7:50。我应该得到一个7:45的平均约会对象

我正在考虑的方法效率低下:

  1. 循环遍历所有日期
  2. 找出0000与时间之差
  3. 将这个时间差相加到总数中
  4. 除以总数
  5. 将时间转换为日期对象

有什么更简单的功能吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-12 17:38:44

从根本上说,您可以将所有Date对象的“Unix时代以来的millis”加起来,并找到这些对象的平均值。现在的棘手之处在于避免溢出。备选方案有:

  1. 除以已知数量(例如1000),以避免溢出;这会降低已知数量的准确性(在本例中为第二个),但如果有超过1000个项,则会失败。
  2. 将每个millis值除以平均结束的日期数;这将始终有效,但难以理解的精度降低。
  3. 使用BigInteger代替

方法1的一个例子:

代码语言:javascript
复制
long totalSeconds = 0L;
for (Date date : dates) {
     totalSeconds += date.getTime() / 1000L;
}
long averageSeconds = totalSeconds / dates.size();
Date averageDate = new Date(averageSeconds * 1000L);

方法3的一个例子:

代码语言:javascript
复制
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());
票数 21
EN

Stack Overflow用户

发布于 2013-08-12 17:45:04

如果有很多日期,将所有日期之和加在一起肯定会导致溢出。如果您想防止这样做,应该这样做(在伪代码中):

代码语言:javascript
复制
var first = dates.getFirst
var sumOfDifferences = 0
loop over all dates
    for each date sumOfDifferences += date - first
var averageDate = first + sumOfDifferences/countOfDates

这将不会使您运行在溢出。

票数 2
EN

Stack Overflow用户

发布于 2013-08-12 17:39:30

这里已经有了一个答案:Sum two dates in Java

您只需使用getTime()对所有日期对象进行汇总,然后将其除以对象数,然后将其转换回Date对象。好了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18193177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档