58,454
社区成员
发帖
与我相关
我的任务
分享
import java.util.Calendar;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TimerTest {
public static void main(String[] args) {
ScheduledExecutorService s = new ScheduledThreadPoolExecutor(1);
s.scheduleAtFixedRate(new InnerTimerTest(), 0, 1, TimeUnit.SECONDS);
}
private static class InnerTimerTest implements Runnable {
private final static String BACKSPACES = getBackspaces(80);
public void run() {
System.out.print(BACKSPACES); // 输出很多个退格符
Xmas xmas = Xmas.getXmas();
System.out.printf("现在是 %tF %<tT 距 %d 年的圣诞节还有 %d 天 %d 时 %d 分 %d 秒",
xmas.getCurrent(),
xmas.getXmasYear(),
xmas.getYearInterval(),
xmas.getHourInterval(),
xmas.getMinuteInterval(),
xmas.getSecondInterval()
);
}
/**
* 生成多个退格符
* @param count
* @return
*/
private static String getBackspaces(int count) {
char[] chs = new char[count];
for(int i = 0; i < count; i++) {
chs[i] = '\b';
}
return new String(chs);
}
}
}
class Xmas {
private final static long SECOND = 1000L;
private final static long MINUTE = 60L * SECOND;
private final static long HOUR = 60L * MINUTE;
private final static long DAY = 24L * HOUR;
private int xmasYear; // 下一个圣诞节的年份
private long interval; // 与下一个圣诞节的毫秒数间隔
private Calendar current; // 当前时间
private Xmas(int xmasYear, long interval, Calendar current) {
this.xmasYear = xmasYear;
this.interval = interval;
this.current = current;
}
public static Xmas getXmas() {
Calendar current = Calendar.getInstance();
Calendar xmas = getNextXmasCalendar(current);
int xmasYear = xmas.get(Calendar.YEAR);
long interval = xmas.getTimeInMillis() - current.getTimeInMillis();
return new Xmas(xmasYear, interval, current);
}
/**
* 获得下一个圣诞节的 Unix 纪元毫秒数
* @param current
* @return
*/
private static Calendar getNextXmasCalendar(Calendar current) {
Calendar xmas = Calendar.getInstance();
xmas.set(Calendar.MONTH, Calendar.DECEMBER);
xmas.set(Calendar.DATE, 25);
xmas.set(Calendar.HOUR_OF_DAY, 0);
xmas.set(Calendar.MINUTE, 0);
xmas.set(Calendar.SECOND, 0);
xmas.set(Calendar.MILLISECOND, 0);
if(current.after(xmas)) {
// 如果当前时间在当前的圣诞节之后,则下一个圣诞节年份加 1
xmas.add(Calendar.YEAR, 1);
}
return xmas;
}
public int getXmasYear() {
return xmasYear;
}
public long getInterval() {
return interval;
}
public Calendar getCurrent() {
return current;
}
public long getYearInterval() {
return interval / DAY;
}
public long getHourInterval() {
return (interval % DAY) / HOUR;
}
public long getMinuteInterval() {
return (interval % HOUR) / MINUTE;
}
public long getSecondInterval() {
return (interval % MINUTE) / SECOND + (interval > 0 ? 1 : 0);
}
}