处理:应该同步的数字不是

时间:2015-11-27 16:04:03

标签: processing

这是我的问题。我正在努力制作一个程序,以秒或分钟为单位计算到下一年(分钟到小数点后1位,秒到无),我得到这个问题,倒计时与系统时间有点不同步。它不是太多,只有大约半秒钟,但个人这让我很烦恼。当我看到计算机上的时钟时,我注意到了这一点,并且,确定,我添加了一个System.out.println()调用来输出倒计时的数字和实际时间。这是我的代码:

import java.util.Calendar;
import java.util.GregorianCalendar;

Calendar currentTime;
Calendar newYear;
int nextYear;
boolean isFullScreen = false;
boolean minutes = false;

void settings() {
  if(isFullScreen) {
    fullScreen();
  } else {
    size(500, 250);
  }
}
void setup() {
  frameRate(60);
}
void draw() {
  background(255, 0, 0);
  currentTime = Calendar.getInstance();
  nextYear = currentTime.get(Calendar.YEAR) + 1;
  newYear = new GregorianCalendar(nextYear, 1, 1, 0, 0, 0);
  textAlign(CENTER, CENTER);
  fill(0);
  if(isFullScreen) {
    textSize(200);
  } else {
    textSize(50);
  }
  long timeInMillis = currentTime.getTimeInMillis();
  long newYearInMillis = newYear.getTimeInMillis();
  if(minutes) {
    text(String.valueOf((float)ceil((float)(newYearInMillis - timeInMillis)/6000)/10), width/2, height/2);
  } else {
    System.out.println(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)) + ", " + currentTime.get(Calendar.SECOND));
    text(String.valueOf(ceil((float)(newYearInMillis - timeInMillis)/1000)), width/2, height/2);
  }
}
void mouseClicked() {
  minutes = !minutes;
}

我得到的输出没有意义:

5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666570, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 10
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11
5666569, 11

请注意倒计时认为它应该在实际时间之前倒数28帧。虽然这不是很大,但它不仅可以引人注目,而且可以让我们想知道问题是什么。

1 个答案:

答案 0 :(得分:0)

首先,不要依赖System.out.println()来计时。它比其他输出慢得多,因此打印语句落后于屏幕时间是正常的。

话虽如此,该计划正在按照您的要求行事 - 将时间向上四舍五入到下一秒。这就是为什么你的屏幕时间比实时提前半秒的原因。

停止使用ceil()功能,您的时间将与系统时间非常接近:

text(String.valueOf((newYearInMillis - timeInMillis)/1000), width/2, height/2);

另外,我不确定你的所有逻辑是否正确。例如,GregorianCalendar个月从零开始,因此1月应为0,而不是1。