我有很多时间戳显示用户进入房间的时间。我想计算平均时间。当某些操作在晚上发生时就会出现问题。 我尝试用milis计算,结果是错误的。
ArrayList<String> times = new ArrayList<String>();
times.add("00:20:01");
times.add("00:00:01");
times.add("23:40:01");
times.add("23:20:01");
times.add("23:20:01");
times.add("00:20:01");
times.add("23:40:01");
times.add("23:40:01");
times.add("00:00:01");
long commonMillis=0;
for (String date:times){
LocalTime time = new LocalTime(date);
long dayMilis = time.getMillisOfDay();
commonMillis = commonMillis + dayMilis;
}
LocalTime average = new LocalTime(commonMillis/times.size());
例如,此代码返回值 14:08:54.333
。因为 00:00 和 23:00
时间(以毫秒为单位计算)相差太远。
请帮我找到计算平均时间的正确方法?
最佳答案
三件事:
您必须定义偏移时间:
如果你想在不知 Prop 体日期的情况下计算不同日期的平均时间,则必须自己定义一个偏移时间。该时间用于判断某个时间是否属于第二天。
该偏移时间可能会根据您获得的值得出。
如果没有偏移时间,您将隐式使用 0 点钟。避免溢出:
如果您的times
列表变得更长,并且long
字段不足以存储累计值,则可能会遇到溢出。您可以使用防溢出的数据结构,例如 BigInteger 或使用 (culmulative) moving average方法。错误的结果构造函数:
构造函数LocalTime(long instant)
隐式使用本地DateTimeZone
从Instant
计算本地时间。这会导致在不同时区使用相同代码时出现不同的时间。
您要使用的方法是LocalTime#fromMillisOfDay
。
以下是考虑上述几点的方法:
long movingAverage = 0;
// 1. define offset
LocalTime offset = new LocalTime("12:00:00");
long offsetMillis = offset.getMillisOfDay();
for (String date : times) {
long sampleMillis = new LocalTime(date).getMillisOfDay();
// align to offset
if (sampleMillis < offsetMillis)
sampleMillis += DateTimeConstants.MILLIS_PER_DAY;
long diff = sampleMillis - offsetMillis;
// 2. use moving average
movingAverage = movingAverage + diff / times.size();
}
// 3. avoid LocalTime(long) constructor
LocalTime result = offset.plusMillis((int) movingAverage);
System.out.println(result); // 23:48:54.329
关于java - 用 joda time 计算平均时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211246/