0

System.currentTimeMillis()用来获取多个值,然后我从另一个中减去一个以获得两个值之间的差异,然后在 Robot 类的delay()方法中使用该值。我需要这个值作为一个整数,因为这是延迟方法将采用的。有什么想法吗?

4

3 回答 3

7

如果该long值适合int,那么您可以像这样简单地转换该值:

int someInt = (int) someLong;

(或者,直接作为 amethod 的参数robot.someMethod((int) someLong);:)

请注意,anint最多可以存储 2147483647(和 2147483647 ms ≈ 24.9 天)的值。

于 2012-07-27T23:27:03.707 回答
1

正如其他答案和评论所说,如果您不关心可能的溢出,一个简单的类型转换就可以工作。而且您可能不需要关心,因为在用户界面方面2147483647毫秒是很长的时间。

但是,如果您确实需要担心,那么这将更加强大:

long time1 = System.currentTimeMillis();
...
long time2 = System.currentTimeMillis();
...
long diff = time2 - time1;
if (diff >= Integer.MIN_VALUE && diff <= Integer.MAX_VALUE) {
    delay((int) diff);
} else {
    throw new SomeException("Delays > 2147483647 milliseconds not supported");
}

还有一个(理论上的)问题,在未来的某个时间,自 1970 年 1 月 1 日以来的毫秒数将不再适合 64 位有符号整数。但这在数十亿年内不会发生- http://en.wikipedia.org/wiki/Year_2038_problem

于 2012-07-27T23:50:47.467 回答
0

作为 aioobe 说

一个简单的类型转换应该可以工作,以防您确定该值实际上总是适合 int。

int delay_amt = (int)delay_amt_long

如果没有,那么您将不得不进行一些额外的处理,例如delay()多次调用该函数,例如 n+1 次

其中 n=delay_amt_long/max_int_size 和 m=delay_amt_long%max_int_size

其中第 (p+1) 次迭代的延迟时间为 m,因此:

delay_amt_long = n*max_int_size + m

或者,您可以使用其他方法来专门检测和处理溢出。

于 2012-07-27T23:49:46.883 回答