在Java中分割长值时出现不一致

时间:2019-02-14 23:58:11

标签: java timestamp overflow long-integer

我知道这看起来很疯狂,现在我一直在挠头,并且很确定我缺少一些东西。

与当前时间相比,我正在计算从当天开始算起的“ countOfMinutes”。为此,我正在执行以下操作:

    long startTime = System.currentTimeMillis();
    // Below mod function gets code to start of the day
    long lastStart = startTime - (startTime % (TimeUnit.DAYS.toMillis(1)));

    long now = System.currentTimeMillis();
    long minuteInMs = TimeUnit.MINUTES.toMillis(1);
    countOfMinutes = (now - lastStart) / minuteInMs;

这是我已经24/7运行的代码的一部分,并会定期重新启动。我从输出中记录了“ lastStart”值,“ now”值和“ countOfMinutes”的日志。我在本地计算机上使用了相同的值,并且得到了预期的值。但是当查看日志时,这些相同的值导致0。我不明白为什么相同的数字会导致不同的值。

这是我从系统运行时获得的日志:

18:21:53.908 INFO  [Thread-3] Adjusted start time= 1550102400000\n
18:21:53.908 INFO  [Thread-3] Current time= 1550168520001\n
18:21:53.908 INFO  [Thread-3] countOfMinutes based on start time= 0\n

因此,我采用了这些价值观并在本地运行,并得到了我期望的结果:

14:52:17.037 [main] INFO  The difference is:66120001
14:52:17.041 [main] INFO  value of countOfMinutes:1102

我在想一些有溢出的东西,但是只是不确定在某些时候可能发生这种情况。我不认为日志会像这样损坏,并且long的toString()方法实际上会显示一件事。

已编辑:使用实际代码进行更新 注意:实际代码已经包含我确定应更新的内容。例如如果那是我将要在计算中使用的内容,则记录lastStart而不是startTime,现在存储然后立即记录,而不是多次调用System.currentTime等等。我想记录的内容与实际变量值(我们不知道)之间存在差异,这可能会导致这种情况,但似乎很奇怪。 下面是代码:

    long startTime = System.currentTimeMillis();
    long lastStart = startTime - (startTime % (TimeUnit.DAYS.toMillis(1)));
    startTime = lastStart;

    logger.info("Adjusted start time= {}", startTime); // Adjust start time to start of the day

    long minuteInMs = TimeUnit.MINUTES.toMillis(1);
    logger.info("Current time= {}", System.currentTimeMillis());

    long now = System.currentTimeMillis();
    long countOfMinutes = (now - lastStart) / minuteInMs;

    logger.info("countOfMinutes based on start time= {}", countOfMinutes);

0 个答案:

没有答案