【问题标题】:Why am I always getting a time difference of zero?为什么我总是得到零时差?
【发布时间】:2017-11-20 09:42:02
【问题描述】:

为什么这个时差总是0?基本上startend 总是具有相同的值。我尝试使用Calendar 而不是Date。如果我使用Duration 而不是日期,我无法比较boolean temp = (diff>500);

private Date now=new Date();
private long start;
private long end;

public void ABC(){
   start = now.getTime();
   ...
   ...
   ...
   ...
   end = now.getTime();
   long diff = end - start;
   boolean temp = (diff>500);
   System.out.println(diff);  //This always outputs 0, basically start and end have same value always
}

【问题讨论】:

  • 因为您使用相同的日期实例作为开始时间和结束时间。这可能是 0 差异的可能原因
  • 你创建一个 new Date()。这存储了它的创建时间。尝试在不同时间创建 两个 new Date()
  • 使用:start=new Date().getTime() and end=new Date().getTime()
  • @akshayapandey 更简单:start = System.currentTimeMillis(); end = System.currentTimeMillis();.
  • 仅供参考,您正在使用麻烦的旧日期时间类,它们现在已被遗留,被 java.time 类所取代。

标签: java date time calendar


【解决方案1】:

因为是同一天。 now = new Date() 将日期设置为当前日期。 .getTime() 只是将日期转换为 long

据我了解,您希望获取两个变量的当前日期,因此您应该使用:

start = new Date().getTime();
end = new Date().getTime();

【讨论】:

  • 更简单:start = System.currentTimeMillis(); end = System.currentTimeMillis();。 (和it's equivalent)。
【解决方案2】:

Java 中的 Date 类有一个默认构造函数,它分配一个 Date 对象并对其进行初始化。 因此,在您的代码中,您在开头初始化了如下。

private Date now=new Date();

所以每次调用now.getTime() 时它只会返回开始时初始化的值。

这意味着在您的情况下,startend 将具有相同的值。

所以 dff 总是为 0

为避免这种情况,您需要创建 Date 类的新对象:

start = new Date().getTime();
end = new Date().getTime();

【讨论】:

  • 可能是原因,还是原因?你似乎对此很不确定。
  • 问题中只使用一个Date 对象肯定会给你一个0的差异。另一方面,对于两个Date对象给你更大的不同,还要求它们是在两个不同的时间创建的;如果两个实例之间的代码在不到一毫秒的时间内执行,你仍然会有 0 的差异。
【解决方案3】:

如果你愿意,当然可以使用java.time.Duration

    Instant start = Instant.now();
    // ...
    Instant end = Instant.now();
    Duration diff = Duration.between(start, end);
    boolean temp = diff.toMillis() > 500;

我同意Andy Turner’s comment,不过,出于您的目的,您不需要实例化任何对象,System.currentTimeMillis() 就足够了。

【讨论】:

  • 在 Java 9 中,一个新的Clock 实现可以以比milliseconds 更精细的粒度捕获当前时刻。在 MacBook Pro 上,我看到 microseconds
  • 另一个通常比毫秒更精细的计时选项是System.nanoTime()。它不会告诉你一天中的时间或类似的东西,但对于 startend 之间的区别,它工作得很好(@BasilBourque,你已经知道这一点,但对于 OP 和后代来说)。
猜你喜欢
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2012-01-12
相关资源
最近更新 更多