0

0

如何在时间类中保留原始输入值以正确计算总秒数

花韻仙語

花韻仙語

发布时间:2026-03-09 10:13:18

|

496人浏览过

|

来源于php中文网

原创

如何在时间类中保留原始输入值以正确计算总秒数

本文讲解如何修改时间类设计,避免因归一化处理(如取模)丢失原始输入值,从而确保 getSeconds() 方法返回基于用户原始输入而非归一化后时间的总秒数。

本文讲解如何修改时间类设计,避免因归一化处理(如取模)丢失原始输入值,从而确保 `getseconds()` 方法返回基于用户原始输入而非归一化后时间的总秒数。

在开发时间处理类(如 CHTime)时,一个常见误区是:将归一化逻辑(如 hour % 24、进位修正)直接写入构造函数并覆盖原始输入字段,导致后续无法还原用户原始输入意图。正如示例中所示——当用户输入 331 小时 34 分钟 674 秒 时,构造函数立即执行:

this.chSec = chSec % 60;           // 674 % 60 → 14
this.chHr = chHr % 24;            // 331 % 24 → 19
this.chMin = (chMin + chSec / 60) % 60; // (34 + 11) % 60 → 45

这使得 chHr、chMin、chSec 字段永久丢失了原始值(331、34、674),而 getSeconds() 仅能基于归一化后的 19:45:14 计算出 71114 秒——这并非用户期望的“原始输入对应的总秒数”(即 331×3600 + 34×60 + 674 = 1194314)。

✅ 正确解决方案:分离存储与展示逻辑

核心原则是:保留原始输入数据用于业务计算,仅在需要格式化显示时进行归一化。推荐两种实现方式:

方案一:新增私有字段存储原始输入(推荐)

在 CHTime 类中增加 originalHours、originalMinutes、originalSeconds 字段,在构造函数中保存原始值,并让 getSeconds() 基于它们计算:

科大讯飞-AI虚拟主播
科大讯飞-AI虚拟主播

科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;

下载
public class CHTime implements Comparable<CHTime> {
    private int chHr, chMin, chSec; // 归一化后用于显示的值(0–23, 0–59, 0–59)
    private final int originalHours, originalMinutes, originalSeconds; // 原始输入,只读

    public CHTime(int hours, int minutes, int seconds) {
        this.originalHours = hours;
        this.originalMinutes = minutes;
        this.originalSeconds = seconds;

        // 归一化逻辑(仅用于 toString / getHour 等展示方法)
        int totalSec = seconds + minutes * 60 + hours * 3600;
        this.chSec = totalSec % 60;
        int totalMin = totalSec / 60;
        this.chMin = totalMin % 60;
        this.chHr = (totalMin / 60) % 24;
    }

    // ✅ 此处返回原始输入换算的总秒数(关键修复!)
    public long getSeconds() {
        return (long) originalHours * 3600 + originalMinutes * 60 + originalSeconds;
    }

    // 展示用方法仍基于归一化值
    public int getHour() { return chHr; }
    public int getMinute() { return chMin; }
    public int getSecond() { return chSec; }
    @Override
    public String toString() {
        return chHr + " hours " + chMin + " minutes " + chSec + " seconds";
    }
}

方案二:重构为“单源真相”——仅存总秒数(更简洁)

彻底放弃分别存储 chHr/chMin/chSec,内部统一以总秒数(long totalSeconds)为核心字段,所有 getter 和 toString() 均动态计算:

public class CHTime implements Comparable<CHTime> {
    private final long totalSeconds; // 唯一真实数据源

    public CHTime(int hours, int minutes, int seconds) {
        this.totalSeconds = (long) hours * 3600 + minutes * 60L + seconds;
    }

    public long getSeconds() {
        return totalSeconds; // 直接返回,零误差
    }

    public int getHour() {
        return (int) ((totalSeconds / 3600) % 24);
    }

    public int getMinute() {
        return (int) ((totalSeconds / 60) % 60);
    }

    public int getSecond() {
        return (int) (totalSeconds % 60);
    }

    @Override
    public String toString() {
        int h = getHour(), m = getMinute(), s = getSecond();
        return h + " hours " + m + " minutes " + s + " seconds";
    }
}

✅ 优势:逻辑更清晰、无状态冗余、天然支持任意大小输入(如 10000 小时)、getSeconds() 永远准确。

⚠️ 注意事项与最佳实践

  • 不要在构造函数中破坏性修改输入值:若需归一化,应通过临时变量或新字段完成,避免覆盖原始语义。
  • 明确字段职责:区分“存储字段”(source of truth)与“缓存字段”(performance optimization)。若使用缓存,务必保证其与源头严格同步。
  • 对 long 运算保持警惕:hours * 3600 可能溢出 int,务必显式使用 long 字面量(如 3600L)或强制类型转换。
  • 单元测试覆盖边界值:验证 getSeconds() 对 24:0:0、1000:0:0、0:0:61 等输入是否返回预期结果。

通过以上重构,你的 CHTime 类既能正确显示归一化后的时间(如 19:45:14),又能精准提供原始输入对应的总秒数(1194314),真正满足“接受原始输入而非仅处理归一化结果”的设计目标。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java进行强制类型转换
java进行强制类型转换

强制类型转换是Java中的一种重要机制,用于将一个数据类型转换为另一个数据类型。想了解更多强制类型转换的相关内容,可以阅读本专题下面的文章。

298

2023.12.01

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

607

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

319

2025.07.15

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

11

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

67

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

158

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号