用java编程逐行输出 钟表一天内三指针重合时间,精确的秒

程序如下:
public static void main(String[] args){
long base=new GregorianCalendar(0,0,0,0,0,0).getTime().getTime();
DateFormat df=new SimpleDateFormat("HH:mm:ss");
for(int t=0;t<60*60*12*2;t++){
int locHourHand=Math.round((t%(60*60*12))/(60*12));
int locMinuteHand=Math.round((t%(60*60))/60);
int locSecondHand=t%60;
if(locHourHand==locMinuteHand&&locHourHand==locSecondHand){
Date date=new Date(base+t*1000);
System.out.println(df.format(date));
}
}
}
希望大家能逐行解释一下这段代码,小弟不是很明白,先谢谢大家!

第1个回答  2011-05-10
long base=new GregorianCalendar(0,0,0,0,0,0).getTime().getTime(); 定义一个0毫秒的基数,为了后面使用format做准备。
DateFormat df=new SimpleDateFormat("HH:mm:ss"); 设置格式化的样式
for循环是安装一天时间长度的总共有60*60*12*2秒(这个因为要精确到秒),在每个秒长度时间上,分别获得时针、分钟和秒针所在表盘的位置(表盘整个圆是60秒)。
然会判断三个针位置是否是一样的,如果一样就输入该时间。
第2个回答  2011-05-10
//构造一个GregorianCalendar,并且将年月日时分秒都定为0,得到一个基础时间值(精确到毫秒)
long base=new GregorianCalendar(0,0,0,0,0,0).getTime().getTime();
DateFormat df=new SimpleDateFormat("HH:mm:ss"); //构造一个时间格式对象(仅仅取时分秒)
//一天有60*60*12*2秒,从0秒开始,逐秒增加,判断该时刻是否发生针的重叠。
//把时钟盘面分成60格,判断时针、分针、秒针是否在同一格子上
for(int t=0;t<60*60*12*2;t++){
//计算时针所在格子,对60*60*12求余是将当前总秒数映射到半天的范围中(时针在后半天与前半天的位置变动一样),然后除以60得到分钟数,然而对于分针来说一分钟走一格子,对于时针来说则是走十二分之一格子(时针60分钟走5个格子),于是又再除以12得到时针所在的格子

int locHourHand=Math.round((t%(60*60*12))/(60*12));
// 对60*60求余得到分、秒段的数据,除以60得到其中分钟数,也对应于分针格子了。
int locMinuteHand=Math.round((t%(60*60))/60);
// 对60求余得到秒段数据,即秒针所在格子
int locSecondHand=t%60;
//若三者相同则表示重叠
if(locHourHand==locMinuteHand&&locHourHand==locSecondHand){
//此时将其恢复为一个正常的Date对象(Date对象精确到毫秒)
Date date=new Date(base+t*1000); //加上之前的基础时间值,再加上当天的时间
System.out.println(df.format(date)); //进行格式化输出追问

Date date=new Date(base+t*1000); //加上之前的基础时间值,再加上当天的时间
您好,我想问一下,这里为什么要加上基础时间值?

追答

因为你要打印的是一天内的时间值,而t是从当天0点0分0秒开始计算的增量秒数,因此必须加上一个处于0点时刻的时间值来得到Date对象。如果加上的时刻不是0点时刻,那么加上增量之后很可能跨到第二天~~~

本回答被提问者采纳
相似回答