计算两次

时间:2017-11-14 01:40:17

标签: java algorithm time

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

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;
    }

2 个答案:

答案 0 :(得分:4)

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

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);
}

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

答案 1 :(得分: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可以是任何整数)。