You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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,需要修正实现。

原代码问题分析

  1. 未复用父类的事件起始时间:当前实现只是直接对输入时间累加周期小时数,没有基于原事件的起始时分秒(dataInceput)来对齐时间,导致保留了输入时间的秒数。
  2. 多余的实例变量: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:54:53