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

Java自定义Time时间类加减分钟功能异常如何修复

问题分析

你的代码核心问题集中在3处:

  1. setMinute 方法逻辑错误:只要传入的分钟数≥60就直接设为0,你给11:00加90分钟时,0+90=90,调用setMinute直接把分钟改成0,自然看不到30的结果
  2. addMinutes 逻辑混乱:入参m和当前minute反复无意义相加,没有正确计算进位的小时数和剩余分钟数
  3. 小时的12小时制转换逻辑多处错误,加减小时后得到的结果不符合预期

修改后的完整代码
import java.util.Scanner;

public class Time {
    private int hour;
    private int minute;

    public Time() {
    }

    public Time(int newHour, int newMinute) {
        setTime(newHour, newMinute);
    }

    public void setTime(int h, int m) {
        setHour(h);
        setMinute(m);
    }

    public void setHour(int h) {
        // 取模24适配任意正负输入,自动换算为0-23的合法小时
        hour = (h % 24 + 24) % 24;
    }

    public void setMinute(int m) {
        // 取模60适配任意正负输入,自动换算为0-59的合法分钟
        minute = (m % 60 + 60) % 60;
    }

    public int getHour() {
        return hour;
    }

    public int getMinute() {
        return minute;
    }

    public void addHours(int h) {
        setHour(hour + h);
        // 统一转换为12小时制
        if (hour == 0) {
            hour = 12;
        } else if (hour > 12) {
            hour -= 12;
        }
    }

    public void subtractHours(int h) {
        setHour(hour - h);
        // 统一转换为12小时制,和加法逻辑对齐
        if (hour == 0) {
            hour = 12;
        } else if (hour > 12) {
            hour -= 12;
        }
    }

    public void addMinutes(int m) {
        int totalMin = minute + m;
        int addHour = totalMin / 60;
        setMinute(totalMin);
        addHours(addHour);
    }

    public void subtractMinutes(int m) {
        int totalMin = minute - m;
        // 处理负数分钟的借位逻辑
        int subHour = totalMin < 0 ? (totalMin / 60) - 1 : totalMin / 60;
        setMinute(totalMin);
        addHours(subHour);
    }

    @Override
    public String toString() {
        return "DateAndTime [hour=" + hour + ", minute=" + minute + "]";
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter the time");
        System.out.print("Hours: ");
        int hour = input.nextInt();
        System.out.print("Minutes: ");
        int minute = input.nextInt();

        Time time = new Time(hour, minute);

        boolean done = false;

        while (!done) {
            System.out.println("1. Add Hours");
            System.out.println("2. Subtract Hours");
            System.out.println("3. Add Minutes");
            System.out.println("4. Subtract Minutes");
            System.out.print("Choice: ");
            switch (input.nextInt()) {
                case 1:
                    time.addHours(input.nextInt());
                    break;

                case 2:
                    time.subtractHours(input.nextInt());
                    break;

                case 3:
                    time.addMinutes(input.nextInt());
                    break;

                case 4:
                    time.subtractMinutes(input.nextInt());
                    break;
            }
            System.out.println("Time is: " + time);

        }
    }

}

核心修改说明
  • 优化setHour/setMinute校验逻辑:使用取模运算适配任意正负输入,自动换算为合法的0-23小时、0-59分钟,不再直接将非法值设为0
  • 重写addHours方法:先计算总小时数取模24得到24小时制时间,再统一转换为12小时制显示,逻辑清晰无歧义
  • 重写addMinutes方法:先计算总分钟数,拆分出要加的小时数和剩余分钟数,先设置分钟再调用addHours加对应小时,完全符合时间计算逻辑
  • 配套重写subtractHours、subtractMinutes方法,逻辑和加法对应,可直接正常使用

测试你提到的场景:初始时间输入11、0,选择加分钟输入90,输出结果为DateAndTime [hour=12, minute=30],和预期一致。


内容的提问来源于stack exchange,提问作者user16854661

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:39:03