0

0

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

聖光之護

聖光之護

发布时间:2026-03-09 13:56:03

|

103人浏览过

|

来源于php中文网

原创

本文讲解如何修改时间类设计,避免因归一化处理丢失原始输入信息,确保 getSeconds() 方法返回基于用户原始输入(而非归一化后)的总秒数。核心在于分离“显示用时间”与“原始输入值”的存储逻辑。

本文讲解如何修改时间类设计,避免因归一化处理丢失原始输入信息,确保 `getseconds()` 方法返回基于用户原始输入(而非归一化后)的总秒数。核心在于分离“显示用时间”与“原始输入值”的存储逻辑。

在开发时间处理类(如 CHTime)时,一个常见误区是:将归一化后的小时、分钟、秒(例如 331 % 24 = 19)直接覆盖原始输入,并以此作为唯一数据源。这会导致 getSeconds() 等方法无法还原真实输入量级——正如示例中,输入 331 小时 34 分 674 秒(即 331×3600 + 34×60 + 674 = 1,194,314 秒),但 getSeconds() 却返回 19×3600 + 45×60 + 14 = 71,114 秒,因其内部仅保存了归一化后的 chHr=19, chMin=45, chSec=14。

根本原因在于构造函数中直接修改并丢弃了原始输入:

public CHTime(int chHr, int chMin, int chSec) {
    this.chSec = chSec % 60;              // 原始 chSec 被覆盖
    this.chHr = chHr % 24;                // 原始 chHr 被覆盖
    this.chMin = (chMin + chSec / 60) % 60;
}

此时 getSeconds() 只能基于已失真的字段计算,必然出错。

正确解法:双字段策略
为兼顾「规范显示」与「精确溯源」,应在类中同时维护两组数据:

  • displayHr, displayMin, displaySec:用于 toString() 和 getHour() 等展示方法(已归一化);
  • rawTotalSeconds:在构造时一次性计算并持久化原始总秒数,getSeconds() 直接返回该值。

以下是重构后的关键代码(精简版):

ChatTTS
ChatTTS

ChatTTS是一个开源的TTS文本转语音生成模型,专为对话场景设计。

下载
public class CHTime implements Comparable<CHTime> {
    private final long rawTotalSeconds; // ✅ 核心:只存一次,永不修改

    // 归一化后用于显示的字段(private,不对外暴露原始值)
    private final int displayHr;
    private final int displayMin;
    private final int displaySec;

    // 构造器1:接收 h/m/s → 立即转为总秒数,再归一化用于显示
    public CHTime(int hr, int min, int sec) {
        this.rawTotalSeconds = hr * 3600L + min * 60L + sec; // ✅ 用 long 防溢出

        // 归一化:取模24小时制,但仅用于显示
        long totalSecsMod24h = this.rawTotalSeconds % (24 * 3600);
        this.displayHr = (int) (totalSecsMod24h / 3600);
        this.displayMin = (int) ((totalSecsMod24h % 3600) / 60);
        this.displaySec = (int) (totalSecsMod24h % 60);
    }

    // 构造器2:接收总秒数 → 直接赋值,归一化逻辑同上
    public CHTime(long elapsedSeconds) {
        this.rawTotalSeconds = elapsedSeconds;

        long totalSecsMod24h = elapsedSeconds % (24 * 3600);
        this.displayHr = (int) (totalSecsMod24h / 3600);
        this.displayMin = (int) ((totalSecsMod24h % 3600) / 60);
        this.displaySec = (int) (totalSecsMod24h % 60);
    }

    // ✅ getSeconds() 现在返回原始输入对应的总秒数(无损)
    public long getSeconds() {
        return rawTotalSeconds;
    }

    // 显示方法使用归一化字段
    public int getHour() { return displayHr; }
    public int getMinute() { return displayMin; }
    public int getSecond() { return displaySec; }

    @Override
    public String toString() {
        return displayHr + " hours " + displayMin + " minutes " + displaySec + " seconds";
    }
}

关键改进点总结:

  • ? 不可变性:所有字段声明为 final,确保线程安全与逻辑清晰;
  • ? 防溢出:hr * 3600L 中显式使用 long 字面量,避免 int 乘法溢出(331小时已超 Integer.MAX_VALUE);
  • ? 单一职责:rawTotalSeconds 专责数值精度,displayXxx 专责人类可读格式;
  • ? 零冗余计算:getSeconds() 是 O(1) 直接返回,无需重复解析;

⚠️ 注意事项:若业务需支持「跨日累计」(如工时统计),应明确区分 getSeconds()(原始输入总量)与 getSecondsIn24hCycle()(仅当日部分)。本方案默认前者为首要需求,符合问题中“期望返回 1194314 秒”的语义。

通过这一设计,程序既能正确显示 19:45:14(符合24小时制惯例),又能保证 getSeconds() 始终返回用户输入所代表的真实时间跨度——这才是健壮时间封装的核心原则。

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
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

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

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

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

59

2026.03.06

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

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

148

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

273

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

93

2026.03.04

热门下载

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

精品课程

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

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