Java 时间测量不正确
Java time measurement incorrect
我有一个 java 代码,它运行一个无限循环,一遍又一遍,在某些情况下,我想在循环中插入一个额外的步骤/函数调用。
我在循环外定义了这些变量:
static boolean wait_activate = false;
static long wait_tmr = -1;
static int wait_delay = 6;
然后,在我的无限循环中,当我想启用附加代码时:
if (some-condition) {
wait_activate = true;
System.out.println("activate");
wait_tmr = (System.currentTimeMillis() / 1000L);
}
在循环开始时,我进行了两次检查以插入附加代码:
if (wait_activate && (wait_tmr + wait_delay) < (System.currentTimeMillis() / 1000L)) {
// if wait period isn't over
do_additional_stuff();
}
if (wait_activate && (wait_tmr + wait_delay) > (System.currentTimeMillis() / 1000L)) {
// wait time is over:
System.out.println("Reset time: " + wait_delay);
System.out.println("Stored time: " + wait_tmr);
System.out.println("Current time: " + (System.currentTimeMillis() / 1000L));
wait_activate = false;
wait_tmr = -1;
}
现在,时间值都以秒/unixtime 为单位。 (currentTimeMillis / 1000 = 秒)。 wait_delay
是 6。这意味着两个 println
应该只在激活后大约 6 秒执行(使用 wait_activate = true
)。
然而,输出是这样的:
activate
Reset time: 6
Stored time: 946685043
Current time: 946685045
我不明白为什么。根据 wait_delay
,它应该等待 6 秒。但是,存储时间与当前时间仅相差2秒。即使我增加了wait_delay。难道我做错了什么?这是 Java 中的错误还是我(必须)使用的奇怪的 JRE 版本中的错误(运行 在 LEGO EV3 上的 LeJOS 0.9.0-beta 上)?
我是不是制作了一个完整的 "beginner mistake" 却没看到?或者那里有什么东西坏了?
当 wait_activate 处于开启状态时,您可能不希望在无限循环中反复发生以下赋值。也许将此作业包装在正确的条件下会有所帮助。
wait_tmr = (System.currentTimeMillis() / 1000L);
看起来问题出在比较运算符上,第一个 if 条件应该包含 > 而不是 <,而第二个 if 条件应该包含 < 而不是 >。您还可以将第二个 "if" 条件转换为第一个 "if" 条件的 "else" 以避免进一步混淆。
我有一个 java 代码,它运行一个无限循环,一遍又一遍,在某些情况下,我想在循环中插入一个额外的步骤/函数调用。
我在循环外定义了这些变量:
static boolean wait_activate = false;
static long wait_tmr = -1;
static int wait_delay = 6;
然后,在我的无限循环中,当我想启用附加代码时:
if (some-condition) {
wait_activate = true;
System.out.println("activate");
wait_tmr = (System.currentTimeMillis() / 1000L);
}
在循环开始时,我进行了两次检查以插入附加代码:
if (wait_activate && (wait_tmr + wait_delay) < (System.currentTimeMillis() / 1000L)) {
// if wait period isn't over
do_additional_stuff();
}
if (wait_activate && (wait_tmr + wait_delay) > (System.currentTimeMillis() / 1000L)) {
// wait time is over:
System.out.println("Reset time: " + wait_delay);
System.out.println("Stored time: " + wait_tmr);
System.out.println("Current time: " + (System.currentTimeMillis() / 1000L));
wait_activate = false;
wait_tmr = -1;
}
现在,时间值都以秒/unixtime 为单位。 (currentTimeMillis / 1000 = 秒)。 wait_delay
是 6。这意味着两个 println
应该只在激活后大约 6 秒执行(使用 wait_activate = true
)。
然而,输出是这样的:
activate
Reset time: 6
Stored time: 946685043
Current time: 946685045
我不明白为什么。根据 wait_delay
,它应该等待 6 秒。但是,存储时间与当前时间仅相差2秒。即使我增加了wait_delay。难道我做错了什么?这是 Java 中的错误还是我(必须)使用的奇怪的 JRE 版本中的错误(运行 在 LEGO EV3 上的 LeJOS 0.9.0-beta 上)?
我是不是制作了一个完整的 "beginner mistake" 却没看到?或者那里有什么东西坏了?
当 wait_activate 处于开启状态时,您可能不希望在无限循环中反复发生以下赋值。也许将此作业包装在正确的条件下会有所帮助。
wait_tmr = (System.currentTimeMillis() / 1000L);
看起来问题出在比较运算符上,第一个 if 条件应该包含 > 而不是 <,而第二个 if 条件应该包含 < 而不是 >。您还可以将第二个 "if" 条件转换为第一个 "if" 条件的 "else" 以避免进一步混淆。