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

Java时间类问题:如何让方法接收原始输入并修复elapsed秒数错误

Java时间转换程序问题:总经过秒数未保留原始输入值

问题场景

输入时/分/秒为331 34 674时,程序正确转换显示为19小时45分钟14秒(小时取模24),但调用getSeconds()返回的是71114(对应19h45m14s),而非预期的1194314(对应331h45m14s)。

原因分析

问题源于两个核心逻辑缺陷:

  • 构造函数丢失原始输入信息:带时/分/秒参数的构造函数直接对chHr取模24、对chMin取模60,丢弃了原始输入中超过一天的时长部分;带长整型秒数的构造函数同样对小时取模24,丢失了完整时长信息。
  • getSeconds()计算逻辑错误:当前方法仅基于处理后的chHr、chMin、chSec计算,只能得到一天内的秒数,无法还原原始输入的总时长。

修复方案

新增存储完整总秒数的成员变量,确保保留原始输入的时长信息,同时调整构造函数和getSeconds()的逻辑:

修改后的CHTime类代码

package CHTime;

public class CHTime implements Comparable<CHTime> {
    // 存储完整的总经过秒数,保留原始输入时长
    private long totalSeconds;
    // 显示用的时分秒(处理后范围:0-23/0-59/0-59)
    private int chHr;
    private int chMin;
    private int chSec;

    // 构造函数:指定时/分/秒
    public CHTime(int chHr, int chMin, int chSec) {
        // 计算并保存完整总秒数
        totalSeconds = (long)chHr * 3600 + chMin * 60 + chSec;
        // 处理显示用的时分秒
        this.chSec = chSec % 60;
        int totalMinutes = chMin + chSec / 60;
        this.chMin = totalMinutes % 60;
        int totalHours = chHr + totalMinutes / 60;
        this.chHr = totalHours % 24;
    }

    // 构造函数:指定总经过秒数
    public CHTime(long chElapsedTime) {
        totalSeconds = chElapsedTime;
        // 处理显示用的时分秒
        this.chSec = (int)(chElapsedTime % 60);
        long totalMinutes = chElapsedTime / 60;
        this.chMin = (int)(totalMinutes % 60);
        long totalHours = totalMinutes / 60;
        this.chHr = (int)(totalHours % 24);
    }

    public int getHour() {
        return chHr;
    }

    public int getMinute() {
        return chMin;
    }

    public int getSecond() {
        return chSec;
    }

    // 返回完整的总经过秒数
    public long getSeconds() {
        return totalSeconds;
    }

    @Override
    public String toString() {
        return chHr + " hours " + chMin + " minutes " + chSec + " seconds";
    }

    @Override
    public int compareTo(CHTime o) {
        return Long.compare(this.totalSeconds, o.totalSeconds);
    }
}

关键修改点

  • 新增totalSeconds成员变量,专门存储完整时长,避免依赖处理后的时分秒计算。
  • 两个构造函数先计算并保存totalSeconds,再处理显示用的时分秒(取模得到0-23/0-59范围)。
  • getSeconds()直接返回totalSeconds,确保返回原始输入对应的总秒数。
  • 修复原构造函数中未处理分钟进位到小时的逻辑漏洞。

测试验证

输入331 34 674时:

  • toString()仍显示19 hours 45 minutes 14 seconds
  • getSeconds()返回1194314,符合预期

输入长整型秒数1194314时:

  • toString()显示19 hours 45 minutes 14 seconds
  • getSeconds()返回1194314,正确保留原始输入值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:16:01