我知道这看起来很疯狂,现在我一直在挠头,并且很确定我缺少一些东西。
与当前时间相比,我正在计算从当天开始算起的“ 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);