Java中如何周期性为日期添加天数?已有Timer需实现加日逻辑
如何用Timer实现每10秒给日期增加1天?
嘿,我看你已经搭好了Timer的基础框架,核心问题应该是日期累加的逻辑有点绕对吧?我来帮你把这部分捋顺,让代码更清晰可靠。
先说说你现有代码的小问题
你当前的代码里每次run()都会新建Calendar实例,而且日期重置和累加的逻辑没对应好——比如每次都调用c.add(Calendar.DAY_OF_MONTH, 1),但又用day变量来计数,这样容易导致日期计算重复或者混乱。我们需要把初始日期固定下来,然后基于这个起点来累加天数。
修正后的代码方案一:用day变量记录累加次数
这种方式适合需要追踪“已经累加了多少天”的场景:
// 把初始日期、格式化器作为成员变量,避免每次run都重复创建 private Date initialDate = new Date(); // 这里替换成你需要的起始日期,比如2019-08-09 private SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy年MM月dd日"); private int accumulatedDays = 0; // 记录已经累加的天数 TimerTask dateIncrementTask = new TimerTask() { @Override public void run() { accumulatedDays++; // 每触发一次,累加天数+1 model.setDay(accumulatedDays); // 基于初始日期,计算累加后的日期 Calendar calendar = Calendar.getInstance(); calendar.setTime(initialDate); calendar.add(Calendar.DAY_OF_MONTH, accumulatedDays); // 格式化日期 String incrementedDate = dateFormatter.format(calendar.getTime()); // 如果需要显示真实当前时间,可以单独获取 String currentRealDate = dateFormatter.format(new Date()); model.setUpdateDate(incrementedDate); // 累加后的目标日期 model.setUpdateDate2(currentRealDate); // 真实的当前时间(按需调整) } }; Timer timer = new Timer(); long initialDelay = 10000; // 第一次执行延迟10秒 long repeatInterval = 10000; // 之后每10秒执行一次 timer.scheduleAtFixedRate(dateIncrementTask, initialDelay, repeatInterval);
更简洁的方案二:直接维护Calendar对象
如果不需要追踪“累加天数”,只需要每次触发就给日期加1天,直接维护一个Calendar成员变量更简单:
private Calendar dateCalendar = Calendar.getInstance(); private SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy年MM月dd日"); TimerTask dateIncrementTask = new TimerTask() { @Override public void run() { dateCalendar.add(Calendar.DAY_OF_MONTH, 1); // 直接给日期加1天 String incrementedDate = dateFormatter.format(dateCalendar.getTime()); model.setUpdateDate(incrementedDate); // 如果需要更新day变量,可以用这个方式获取当前累加的天数: // long diffInMillis = dateCalendar.getTime().getTime() - new Date().getTime(); // int days = (int) (diffInMillis / (1000 * 60 * 60 * 24)); // model.setDay(days); } }; Timer timer = new Timer(); timer.scheduleAtFixedRate(dateIncrementTask, 10000, 10000);
关键要点说明
- 固定初始日期:把起始日期(比如你例子里的2019年8月9日)存为成员变量,确保每次累加都基于同一个起点,不会和真实时间混淆。
- 减少对象创建:把
SimpleDateFormat、Calendar这些对象尽量提到方法外,避免每次run()都新建,提升性能。 - 逻辑清晰化:要么用变量记录累加次数,要么直接操作Calendar对象,避免两种方式混用导致逻辑混乱。
内容的提问来源于stack exchange,提问作者Christian Michael Tan
相关产品推荐
相关产品推荐

