【发布时间】:2012-02-04 03:10:16
【问题描述】:
我正在尝试从 Date 获取微秒,但我做不到。
Date date = new Date()
【问题讨论】:
-
你能解释一下吗
-
添加“大喊大叫”的编辑对您的问题根本没有帮助...
我正在尝试从 Date 获取微秒,但我做不到。
Date date = new Date()
【问题讨论】:
不,Date 只存储毫秒精度的值。如果您想要微秒级精度,您可能希望将JSR-310 或java.sql.Timestamp 视为一个小技巧——但不要指望任何内置类(如Calendar 和DateFormat)能够处理任何超过毫秒的时间。
如果您尝试执行计时(例如用于基准测试),您应该使用System.nanoTime,但这应该仅用于类似秒表的用例 -它不会以有意义的方式为您提供“当前挂钟时间”。
【讨论】:
Date 和 Calendar 都没有提供这种精确度,Java 中没有任何东西可以为您提供这种精确度的当前日期/时间。 Timestamp 可以表示小到纳秒的值,但通常该值由数据库提供。
我所做的是定期查找 currentTimeMillis 和 nanoTime() 之间的差异(因为这会漂移很多),并使用 nanoTime() + OFFSET 作为 currentTimeNS。 (更具体地说,我使用 RDTSC 机器代码指令,它带有更多的小问题;)
但是,随着时间的推移,它不如 currenTimeMillis() 准确,而 currenTimeMillis() 本身可以在一小时内漂移许多毫秒。
只有了解它的局限性,它才会真正有用。
【讨论】:
要以微秒为单位测量时间,您需要使用 System.nanoTime() 函数,该函数将根据系统可用的最准确时钟返回以微秒为单位的时间。
对用户而言,这与 System.currentTimeMilis() 毫秒的作用几乎相同,您只需定义开始时间和结束时间,然后将差异取反,即可了解操作花费了多长时间。例如:
long startTime = System.nanoTime();
//Do some kind of processing;
//loop, IO, whatever you want to measure
long endTime = System.nanoTime();
long elapsedTime = endTime - startTime;
最后一点可以省略,为了简单起见,我把它写得很冗长:
long elapsedTime = System.nanoTime() - startTime;
这不应该用于测量实时,因为它几乎没有意义或保证它甚至可以与之相提并论。以上所有信息都可从System 的 Java API 文档中获得。
【讨论】: