【问题标题】:Count milliseconds between two times计算两次之间的毫秒数
【发布时间】:2017-11-14 01:40:17
【问题描述】:

我需要一个算法来计算这些时间之间的毫秒数

HH:MM:SS,MS  --> HH:MM:SS,MS

00:08:50,800 --> 00:08:55,250

我写了 4 次 java 代码,但我认为我没有理解这个想法,我搜索了它,但所有解决方案都使用了库,我不想使用库。

这是我写的java代码,但它没有给我正确的偏移量

private int findOffset(Time t1, Time t2) {
        int offset = 0;
        int diffHH = (t2.getHH() - t1.getHH());
        int diffMM = (t2.getMM() - t1.getMM());
        int diffSS = (t2.getSS() - t1.getSS());
        int diffMS = (t2.getMS() - t1.getMS());
        if (diffHH != 0) {
            if (diffHH < 0) {
                diffHH = 24 - t1.getHH() + t2.getHH();
            }
            offset += (3600000 * diffHH);
        }

        if (diffMM != 0) {
            if (diffMM < 0) {
                diffMM = 60 - t1.getMM() + t2.getMM();
            }
            offset += (60000 * diffMM);
        }
        if (diffSS != 0) {
            if (diffSS < 0) {
                diffSS = 60 - t1.getSS() + t2.getSS();
            }
            offset += (1000 * diffSS);
        }

        if (diffMS != 0) {

            if (diffMS < 0) {
                diffMS =  t1.getMS() + t2.getMS();
            }

            offset -= diffMS;
        }

        return offset;
    }

这是另一个代码

private int findOffset2(Time t1, Time t2) {
        int offset = 0;
        int hh1 = t1.getHH(), hh2 = t2.getHH();
        int mm1 = t1.getMM(), mm2 = t2.getMM();
        int ss1 = t1.getSS(), ss2 = t2.getSS();
        int ms1 = t1.getMS(), ms2 = t2.getMS();

        while (hh1 != hh2 || mm1 != mm2
                || ss1 != ss2 || ms1 != ms2) {
            offset++;

            ms1++;
            while (ms1 >= 1000) {
                ss1++;

                while (ss1 >= 60) {
                    ss1 -= 60;
                    mm1++;
                }

                while (mm1 >= 60) {
                    mm1 -= 60;
                    hh1++;
                }

                ms1 -= 1000;
            }

            if(hh1 == hh2 && mm1 == mm2
                && ss1 == ss2 && ms1 == ms2){
                  System.out.println("test");  
                }

        }

        return offset;
    }

【问题讨论】:

  • 那么您应该将您的代码添加到问题中,即使它似乎无法正常工作或以其他方式发布会让人觉得很愚蠢,但请执行此操作。并用 Java 标记您的问题。
  • 只计算毫秒,然后将它们转换为小时、分钟、秒和毫秒,并以上述格式打印
  • @yacc 我不是要代码我只是想要一个描述或算法来阐明如何做,所以我可以尝试另一种方法。
  • @LuaiGhunim 你没看懂我,时间格式是输入,毫秒是输出。

标签: java algorithm time


【解决方案1】:

想法是将 Time 转换为 ms 并返回差异:

private int timeToMs(Time t) {
    return t.getHH() * 60 * 60 * 1000 + t.getMM() * 60 * 1000 + t.getSS() * 1000 + t.getMS();
}

private int findOffset(Time begin, Time end) {
    return timeToMs(end) - timeToMs(begin);
}

编辑:这个答案假设给定的时间是在同一天。

【讨论】:

  • 如果 start=23:55:00.000 和 end=00:10:00.000 您将得到一个负数而不是 15 分钟的间隔。
  • 是的,但是我们怎么知道两个时代之间只有一天呢?
  • 这是一个很好的观点。 OP没有正确指定要求。但如果你把它发挥到极致,即使像 10:11:12.345 到 10:11:13.678 这样的时间,你的答案也可能不正确。可能是1333毫秒的间隔,但你怎么知道不是1天+1333毫秒,还是2天+1333毫秒?
  • 哈哈你也说得对。也许如果 op 想要以 ms 为单位的结果,那是因为开始和结束之间没有太多时间(所以你的第一条评论是有道理的)。
  • @senerh 是的,它在同一天
【解决方案2】:
private int findOffset(Time t1, Time t2) {
    int hh1 = t1.getHH(), hh2 = t2.getHH();
    int mm1 = t1.getMM(), mm2 = t2.getMM();
    int ss1 = t1.getSS(), ss2 = t2.getSS();
    int ms1 = t1.getMS(), ms2 = t2.getMS();

    int offset = ((((hh2 - hh1) * 60) + (mm2 - mm1)) * 60) + (ss2 - ss1)) * 1000 + (ms2 - ms1);

    if (offset < 0)
        offset += 24*60*60*1000;
    return offset;
}

请注意,这总是给出 0 到 23h 59m 59.999ms 范围内的答案。该问题没有指定两个给定时间的任何日期;因此,真正的答案可能是 + 或 - N 天(其中 N 可以是任何整数)。

【讨论】:

  • 这个代码也是正确的,谢谢,但我选择了小代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2013-05-05
  • 2023-02-21
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多