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));
}
}
}
//构造一个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点时刻,那么加上增量之后很可能跨到第二天~~~
从BAIDU上发现的答案,觉得讲得很清晰