java - 用 joda time 计算平均时间

标签 java jodatime

我有很多时间戳显示用户进入房间的时间。我想计算平均时间。当某些操作在晚上发生时就会出现问题。 我尝试用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 时间(以毫秒为单位计算)相差太远。

请帮我找到计算平均时间的正确方法?

最佳答案

三件事:

  1. 您必须定义偏移时间:
    如果你想在不知 Prop 体日期的情况下计算不同日期的平均时间,则必须自己定义一个偏移时间。该时间用于判断某个时间是否属于第二天。
    该偏移时间可能会根据您获得的值得出。
    如果没有偏移时间,您将隐式使用 0 点钟。

  2. 避免溢出:
    如果您的 times 列表变得更长,并且 long 字段不足以存储累计值,则可能会遇到溢出。您可以使用防溢出的数据结构,例如 BigInteger 或使用 (culmulative) moving average方法。

  3. 错误的结果构造函数:
    构造函数 LocalTime(long instant) 隐式使用本地 DateTimeZoneInstant 计算本地时间。这会导致在不同时区使用相同代码时出现不同的时间。
    您要使用的方法是 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/

相关文章:

java - 打印链表中的所有节点

java - 巴基斯坦从公历到回历/伊斯兰日期的转换

Android:Joda 删除时区原始文件

java - 在jodaTime中获取主格月份名称

java - 为什么使用刚刚创建的文件夹时会引发 AccessDeniedException?

java - 负载均衡 MQTT 客户端

java - 队列是抽象的;无法实例化

java - 传递对方法的引用而不是值(或类似的东西)-JAVA

java - 为什么这些奇怪的结果要计算两个 JODA 瞬间之间的年份?

java - 是否可以以某种方式扩展标记为最终的 Joda-Time 类?