【问题标题】:Why does my date difference function spit out incorrect values randomly?为什么我的日期差异函数会随机吐出不正确的值?
【发布时间】:2011-10-15 14:17:50
【问题描述】:

我正在使用下面的代码来计算并返回两个日期之间的差异..

/**
 * Calculate the absolute difference between two Date without
 * regard for time offsets
 *
 * @param d1 Date one
 * @param d2 Date two
 * @return The fields day, hour, minute, second and millisecond
 */
public static long[] getTimeDifference(Date d1, Date d2) {
    long[] result = new long[7];
    Calendar cal = Calendar.getInstance();
    cal.setTime(d1);

    long t1 = cal.getTimeInMillis();
    cal.setTime(d2);

    long diff = Math.abs(cal.getTimeInMillis() - t1);
    long diffms = diff;


    final int ONE_SECOND = 1000;
    final int ONE_MINUTE = ONE_SECOND * 60;
    final int ONE_HOUR = ONE_MINUTE * 60;
    final int ONE_DAY = ONE_HOUR * 24;
    final int ONE_WEEK = ONE_DAY * 7;

    long w = diff / ONE_WEEK;
    diff %= ONE_WEEK;

    long d = diff / ONE_DAY;
    diff %= ONE_DAY;

    long h = diff / ONE_HOUR;
    diff %= ONE_HOUR;

    long m = diff / ONE_MINUTE;
    diff %= ONE_MINUTE;

    long s = diff / ONE_SECOND;

    long ms = diff % ONE_SECOND;

    result[0] = w;
    result[1] = d;
    result[2] = h;
    result[3] = m;
    result[4] = s;
    result[5] = ms;
    result[6] = diffms;

    Log.d("FTT", result[0] + "w, " + result[1] + "d, " + result[2] + "h, " + result[3] + "m, " + result[4] + "s, " + result[5] + "ms, " + result[6] + " diffms, " + "time1: " + t1 +", time2:" + cal.getTimeInMillis() );
    return result;
}

该代码运行良好,只是偶尔会随机地吐出一个不正确的值。请参阅以下日志,每秒更新一次,在上述代码末尾附近创建(w/Log.d):

07-28 17:20:29.225: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 30s, 772ms, 82470772 diffms, time1: 1311981300000, time2:1311898829228
07-28 17:20:30.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 29s, 773ms, 82469773 diffms, time1: 1311981300000, time2:1311898830227
07-28 17:20:31.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 28s, 772ms, 82468772 diffms, time1: 1311981300000, time2:1311898831228
07-28 17:20:32.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 27s, 773ms, 82467773 diffms, time1: 1311981300000, time2:1311898832227
07-28 17:20:33.226: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 26s, 772ms, 82466772 diffms, time1: 1311981300000, time2:1311898833228
07-28 17:20:34.227: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 13s, 67ms, 4377433067 diffms, time1: 1311981300000, time2:1311898834229
07-28 17:20:35.223: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 24s, 771ms, 82464771 diffms, time1: 1311981300000, time2:1311898835229
07-28 17:20:36.228: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 23s, 770ms, 82463770 diffms, time1: 1311981300000, time2:1311898836230
07-28 17:20:37.225: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 22s, 769ms, 82462769 diffms, time1: 1311981300000, time2:1311898837231
07-28 17:20:38.229: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 21s, 769ms, 82461769 diffms, time1: 1311981300000, time2:1311898838231
07-28 17:20:39.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 20s, 768ms, 82460768 diffms, time1: 1311981300000, time2:1311898839232
07-28 17:20:40.233: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 7s, 65ms, 4377427065 diffms, time1: 1311981300000, time2:1311898840231
07-28 17:20:41.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 18s, 768ms, 82458768 diffms, time1: 1311981300000, time2:1311898841232
07-28 17:20:42.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 17s, 768ms, 82457768 diffms, time1: 1311981300000, time2:1311898842232
07-28 17:20:43.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 16s, 766ms, 82456766 diffms, time1: 1311981300000, time2:1311898843234
07-28 17:20:44.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 15s, 766ms, 82455766 diffms, time1: 1311981300000, time2:1311898844234
07-28 17:20:45.233: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 14s, 765ms, 82454765 diffms, time1: 1311981300000, time2:1311898845235
07-28 17:20:46.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 13s, 765ms, 82453765 diffms, time1: 1311981300000, time2:1311898846235
07-28 17:20:47.234: DEBUG/FTT(2095): 7w, 1d, 15h, 57m, 0s, 60ms, 4377420060 diffms, time1: 1311981300000, time2:1311898847236
07-28 17:20:48.235: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 11s, 763ms, 82451763 diffms, time1: 1311981300000, time2:1311898848237
07-28 17:20:49.235: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 10s, 763ms, 82450763 diffms, time1: 1311981300000, time2:1311898849237
07-28 17:20:50.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 9s, 764ms, 82449764 diffms, time1: 1311981300000, time2:1311898850236
07-28 17:20:51.234: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 8s, 763ms, 82448763 diffms, time1: 1311981300000, time2:1311898851237
07-28 17:20:52.236: DEBUG/FTT(2095): 0w, 0d, 22h, 54m, 7s, 763ms, 82447763 diffms, time1: 1311981300000, time2:1311898852237

正如您在上面看到的,三个日志行显示的值不一致。在我看来 time1 和 time2 都很好,并且在获取两者之间的差异时会出现问题..

long diff = Math.abs(cal.getTimeInMillis() - t1);

关于为什么会发生这种情况的任何想法?我已经绞尽脑汁想不通了。

【问题讨论】:

  • 你有没有通过代码来发现这是为什么?
  • 在不知道输入(即d1d2)的情况下,没有人可以回答您的问题。看起来问题出在这个函数之外。
  • 关于 07-28 17:20:34.227 行:DEBUG/FTT(2095):如果我理解正确,那么 diffms=abs(time1-time2)=1311981300000-1311898834229=82465771!=4377433067。当然,你的其他价值观也会被搞砸。
  • 当然,您可以直接从 Date 对象中提取毫秒数 - 无需涉及 Calendar
  • 我无法使用完全相同的代码重现该问题,并且每秒调用一次,当前日期/时间和日期/时间设置为从执行开始后的 23 小时。您能否详细说明导致它的确切条件?

标签: java android math date datetime


【解决方案1】:

来自 Math.abs 的 javadocs:“请注意,如果参数等于 Long.MIN_VALUE 的值,即最负的可表示 long 值,则结果是相同的值,即为负。”

如果 (cal.getTimeInMillis() - t1) 的结果是 Long.MIN_VALUE,您将在模运算中使用负​​值。 Afaik,这样做可能会导致意想不到的结果。

【讨论】:

猜你喜欢
  • 2021-06-18
  • 2016-08-10
  • 1970-01-01
  • 2017-12-14
  • 2020-09-04
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多