java中的毫秒计时

java中的毫秒计时,java,events,calendar,timing,Java,Events,Calendar,Timing,我在Java应用程序中计时各种事务。在事务开始时,我通过实例化一个日历,然后获取小时、分钟、秒和毫秒来获取开始时间。我完成了事务,实例化了一个新日历,得到了一个新的小时、分钟、秒和毫秒。我的推理是,开始时间和结束时间之间的差异就是事务的时间。这似乎在大多数情况下都有效,但在很小的一部分时间里,结束时间早于开始时间。为什么会发生这种情况?我如何防止它?首先,计算差异的一种更简单的方法是使用类似于System.currentTimeMillis()或System.nanoTime()的东西-这样,你

我在Java应用程序中计时各种事务。在事务开始时,我通过实例化一个日历,然后获取小时、分钟、秒和毫秒来获取开始时间。我完成了事务,实例化了一个新日历,得到了一个新的小时、分钟、秒和毫秒。我的推理是,开始时间和结束时间之间的差异就是事务的时间。这似乎在大多数情况下都有效,但在很小的一部分时间里,结束时间早于开始时间。为什么会发生这种情况?我如何防止它?

首先,计算差异的一种更简单的方法是使用类似于
System.currentTimeMillis()或
System.nanoTime()的东西
-这样,你不需要做任何事情,只需要简单的减法就可以得到开始和结束之间的毫秒数或纳秒数

然而,如果您的系统时钟正在被NTP或类似的东西更新,那么时间可能会偶尔有效地倒转——这取决于时钟偏移的处理方式。(一些系统只是将系统时钟减慢一段时间,以使其回到现实中;另一些系统可能存在不连续性。)

我不确定避免这种情况的最佳方法是什么——我不相信JRE目前在.NET中有任何等同于秒表的东西,它纯粹用于测量时间间隔,并且(我相信)不会被系统时钟的变化搞得一团糟


(顺便说一句,我同意Erick的建议-尽管我认为你不需要它来解决这个特殊问题。)

代码是什么样子的,你在哪里创建日期,并调用你的事务处理方法?如果你也展示一些你为此编写的代码,那么就很容易说出来……根据我的经验,linux上的计时要比windows精确得多。System.currentTimeInMilis倾向于在windows上以较大的块向前跳过。。。不确定这是否重要,但可以这样说,System.nanoTime不受墙时间更改(如NTP等)的影响。纳米时间的唯一目的是测量经过的时间。