如何创建Java简单重复事件类EvenimentRecurent?
问题修正:EvenimentRecurent类的urmatorulEveniment方法实现
问题说明
需要实现EvenimentRecurent作为Eveniment的子类,要求:
- 包含构造方法
EvenimentRecurent(String dataInceput, String dataSfarsit, String nume, int numarOre)和int类型成员变量numarOre - 实现
public String urmatorulEveniment(String dataP)方法,输入格式为yyyy-MM-dd HH:mm:ss的字符串,返回同格式的下一个事件时间字符串
当前调用urmatorulEveniment("2019-04-19 22:46:23")返回2019-04-20 22:46:23,但期望结果是2019-04-20 22:46:00,需要修正实现。
原代码问题分析
- 未复用父类的事件起始时间:当前实现只是直接对输入时间累加周期小时数,没有基于原事件的起始时分秒(
dataInceput)来对齐时间,导致保留了输入时间的秒数。 - 多余的实例变量:
dataP作为实例变量会被多次调用覆盖,存在线程安全隐患,方法内直接使用参数即可。
修正后的完整代码
import java.text.*; import java.util.*; class Eveniment { private Date dataInceput, dataSfarsit; private String nume; public Eveniment(String dataInceput, String dataSfarsit, String nume) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { this.dataInceput = format.parse(dataInceput); this.dataSfarsit = format.parse(dataSfarsit); } catch (Exception e) { System.out.println("Data nu este in formatul cerut!"); } this.nume = nume; } public Date getDataInceput() { return dataInceput; } public Date getDataSfarsit() { return dataSfarsit; } public String getNume() { return nume; } } class EvenimentRecurent extends Eveniment { private int numarOre; public EvenimentRecurent(String dataInceput, String dataSfarsit, String nume, int numarOre) { super(dataInceput, dataSfarsit, nume); this.numarOre = numarOre; } public String urmatorulEveniment(String dataInput) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date inputDate = null; try { inputDate = format.parse(dataInput); } catch (Exception e) { System.out.println("Data nu este in formatul cerut!"); return null; } // 获取原事件的起始时间,提取时分秒信息 Calendar eventCal = Calendar.getInstance(); eventCal.setTime(getDataInceput()); int targetHour = eventCal.get(Calendar.HOUR_OF_DAY); int targetMinute = eventCal.get(Calendar.MINUTE); int targetSecond = eventCal.get(Calendar.SECOND); // 处理输入时间,对齐到原事件的时分秒 Calendar inputCal = Calendar.getInstance(); inputCal.setTime(inputDate); inputCal.set(Calendar.HOUR_OF_DAY, targetHour); inputCal.set(Calendar.MINUTE, targetMinute); inputCal.set(Calendar.SECOND, targetSecond); // 如果对齐后的时间早于等于输入时间,就加上周期小时数 if (inputCal.getTime().compareTo(inputDate) <= 0) { inputCal.add(Calendar.HOUR_OF_DAY, numarOre); } return format.format(inputCal.getTime()); } } public class Main { public static void main(String[] args) { EvenimentRecurent er = new EvenimentRecurent("2019-03-09 22:46:00", "2019-03-09 23:00:00", "Informatics", 24); System.out.println(er.urmatorulEveniment("2019-04-19 22:46:23")); // 输出:2019-04-20 22:46:00 } }
关键修改点
- 移除多余实例变量:删除
private Date dataP,方法内直接使用局部变量处理输入时间。 - 对齐事件时间:从父类获取原事件的起始时分秒,将输入时间调整为该时分秒。
- 判断周期叠加:如果调整后的时间未晚于输入时间,就加上指定的周期小时数,确保返回的是下一个符合要求的事件时间。
内容的提问来源于stack exchange,提问作者MihaiCatalim
相关产品推荐
相关产品推荐

