【问题标题】:System.currentTimeMillis() is not accurate on windows XP?System.currentTimeMillis() 在 Windows XP 上不准确?
【发布时间】:2011-10-22 11:02:23
【问题描述】:

看来System.currentTimeMillis 不是很准确。

查看此示例:

public class MillisTime {
    public static void main(String[] args) {
        long start = 0;
        long end = 0;
        while (true) {
            if (start == 0) {
                start = System.currentTimeMillis();
            } else {
                long current = System.currentTimeMillis();
                if (current != start) {
                    end = current;
                    break;
                }
            }
        }
        System.out.println("The time interval of your OS: " + (end - start) + "ms");
    }
}

结果是(在 Windows XP 上):

The time interval of your OS: 15ms

为什么不是1ms?以及如何获得当前时间的精确毫秒?

【问题讨论】:

    标签: java time


    【解决方案1】:

    这完全是意料之中的。使用DateTime.Now 在.NET 上您会看到相同的内容。 (请参阅 Eric Lippert 的 blog post on the topic,了解有关同一主题的面向 .NET 的观点。)

    您可以使用System.nanoTime() 来获得更准确的计时器仅用于测量 - 这并不意味着提供绝对时间,它仅用于测量间隔.

    我不知道有什么方法可以从 Java 或 Win32 获得更准确的绝对时间。老实说,系统时钟到底有多准确?即使定期与 NTP 服务器同步,我预计至少会有几毫秒的误差。

    基本上,如果您依赖于真正准确地获得绝对时间,您可能应该更改您的设计。

    【讨论】:

    • 为什么在 2012 年无法从 windows 中获得准确的时间。我用 ms 时间记录事情,所以我可以看到事情需要多长时间才能运行。我需要看看有些事情是否需要 2 毫秒和 7 毫秒,这样我才能进行调整,但在 Windows 中这是完全不可能的。还有人认为这很疯狂吗? (我是一个 unix 小妞,以前从来没有遇到过这个问题。)
    • @stu:简单地说,您不应该将挂钟用作秒表。挂钟旨在为您提供当前时间的良好表示;它不是为测量时间上的微小差异而设计的。这正是 nanoTime 的用途。
    【解决方案2】:

    是的。 System.currentTimeMillis() 的 javadoc 说:

    以毫秒为单位返回当前时间。请注意,虽然单位 返回值的时间为毫秒,粒度为 value 取决于底层操作系统,可能更大。 例如,许多操作系统以几十为单位测量时间 毫秒。

    您可以使用System.nanoTime(),但请务必阅读其 javadoc 以了解其局限性。

    【讨论】:

      【解决方案3】:

      在 windows 上使用 java 是不可能得到更准确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2020-02-05
        • 2011-07-30
        • 1970-01-01
        • 2011-10-29
        • 1970-01-01
        • 2011-03-03
        相关资源
        最近更新 更多