Processing 处理:应该同步的数字不是';T

Processing 处理:应该同步的数字不是';T,processing,Processing,这是我的问题。我正在制作一个程序,以秒或分钟(分钟到小数点后1位,秒到零)倒计时到下一年,我遇到了这个问题,倒计时与系统时间有点不同步。这不算太多,只有半秒钟左右,但就我个人而言,这让我很烦。我在查看计算机上的时钟时注意到了这一点,可以肯定的是,我添加了一个System.out.println()调用来输出倒计时的数字和实际时间。这是我的密码: import java.util.Calendar; 导入java.util.GregorianCalendar; 日历当前时间; 农历新年; int

这是我的问题。我正在制作一个程序,以秒或分钟(分钟到小数点后1位,秒到零)倒计时到下一年,我遇到了这个问题,倒计时与系统时间有点不同步。这不算太多,只有半秒钟左右,但就我个人而言,这让我很烦。我在查看计算机上的时钟时注意到了这一点,可以肯定的是,我添加了一个
System.out.println()
调用来输出倒计时的数字和实际时间。这是我的密码:

import java.util.Calendar;
导入java.util.GregorianCalendar;
日历当前时间;
农历新年;
int nextYear;
布尔值isFullScreen=false;
布尔分钟=假;
无效设置(){
如果(全屏显示){
全屏();
}否则{
尺寸(500250);
}
}
无效设置(){
帧率(60);
}
作废提款(){
背景(255,0,0);
currentTime=Calendar.getInstance();
nextYear=currentTime.get(日历年)+1;
newYear=新的gregorianalendar(nextYear,1,1,0,0);
textAlign(居中,居中);
填充(0);
如果(全屏显示){
文本大小(200);
}否则{
文本大小(50);
}
long-timeInMillis=currentTime.getTimeInMillis();
long newYearInMillis=newYear.getTimeInMillis();
若有(分钟){
文本(String.valueOf((float)cell((float)(newYearInMillis-timeInMillis)/6000)/10)、宽度/2、高度/2);
}否则{
System.out.println(String.valueOf(ceil((float)(newYearInMillis-timeInMillis)/1000))+,“+currentTime.get(Calendar.SECOND));
文本(String.valueOf(ceil((float)(newYearInMillis-timeInMillis)/1000)),宽/2,高/2;
}
}
void mouseClicked(){
分钟=!分钟;
}
我得到的输出毫无意义:

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帧。虽然这并不是什么大问题,但它不仅足以引起注意,而且足以让人发疯,试图找出问题所在。

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

这就是说,程序正在做你告诉它要做的事情——它将时间向上舍入到下一秒。这就是为什么您的屏幕时间比实时时间提前半秒的原因

只要停止使用
ceil()
函数,您的时间就会与系统时间非常同步:

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

另外,我不确定你的逻辑是否正确。例如,
gregorianalendar
月份是以零为基础的,所以一月应该是0,而不是1。

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

这就是说,程序正在做你告诉它要做的事情——它将时间向上舍入到下一秒。这就是为什么您的屏幕时间比实时时间提前半秒的原因

只要停止使用
ceil()
函数,您的时间就会与系统时间非常同步:

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

另外,我不确定你的逻辑是否正确。例如,
gregorianalendar
月份是以零为基础的,因此一月应该是0,而不是1。

我使用
ceil()
函数的逻辑是,当剩余时间为1.00时,它应该从2变为1。我认为解决这个问题的简单方法是在传递给
String.valueOf()
的数字上加1,就像
text(String.valueOf((newYearInMillis-timeInMillis)/1000+1)、width/2、height/2一样(float)之后
将使其直接将
long
值除以1000,因此它将丢弃剩余值,因此1000/1000=1,+1=2,如果还有1000毫秒,但999/1000=0,+1=1。我认为这不是最好的方法,因为1000会给你2而不是1,但我找不到更好的方法。@JustinBarker仔细想想,我想加1可能是最好的方法。最坏的情况是错误的时间为1/60秒。我使用
ceil()
函数的逻辑是,当剩余时间为1.00时,它应该从2变为1。我认为解决这个问题的简单方法是在传递给
String.valueOf()
的数字上加1,就像
text(String.valueOf((newYearInMillis-timeInMillis)/1000+1)、width/2、height/2一样(float)之后
将使其直接将
long
值除以1000,这样它就可以