当前位置: 首页 > article >正文

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点

  • JavaScript 可以轻松实现时间格式(HH:mm:ss 或 HH:mm)与十进制小时(如 17.5)的相互转换。
  • 两个函数分别处理时间字符串到十进制小时,以及十进制小时到时间字符串的转换,支持灵活的输入和输出格式。
  • 这些函数适用于时间跟踪、工资计算和数据可视化等场景,代码简单且健壮。
时间字符串到十进制小时

以下函数将 17:00:00 或 17:00 转换为十进制小时(如 17.0 或 17.5):

function timeToDecimal(timeStr) {const parts = timeStr.split(':');if (parts.length < 2 || parts.length > 3) {throw new Error('Invalid time format. Expected HH:mm or HH:mm:ss');}const [hours, minutes, seconds = 0] = parts.map(Number);if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) {throw new Error('Invalid time values');}if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) {throw new Error('Time values out of range');}const decimalTime = hours + (minutes / 60) + (seconds / 3600);return parseFloat(decimalTime.toFixed(2));
}

示例

  • timeToDecimal('17:00:00') 返回 17.0
  • timeToDecimal('17:30') 返回 17.5
十进制小时到时间字符串

以下函数将十进制小时(如 17.5)转换为 HH:mm:ss 或 HH:mm 格式:

function decimalToTime(decimalHours, format = 'HH:mm:ss') {if (typeof decimalHours !== 'number' || isNaN(decimalHours) || decimalHours < 0) {throw new Error('Invalid decimal hours');}let hours = Math.floor(decimalHours);let minutesDecimal = (decimalHours - hours) * 60;let minutes = Math.floor(minutesDecimal);let secondsDecimal = (minutesDecimal - minutes) * 60;let seconds = Math.round(secondsDecimal);if (seconds >= 60) {minutes += 1;seconds -= 60;}if (minutes >= 60) {hours += 1;minutes -= 60;}const pad = num => num.toString().padStart(2, '0');if (format === 'HH:mm:ss') {return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;} else if (format === 'HH:mm') {const totalMinutes = Math.round(minutes + seconds / 60);let finalHours = hours;let finalMinutes = totalMinutes;if (totalMinutes >= 60) {finalHours += 1;finalMinutes = 0;}return `${pad(finalHours)}:${pad(finalMinutes)}`;} else {throw new Error('Invalid format. Expected "HH:mm:ss" or "HH:mm"');}
}

示例

  • decimalToTime(17.5, 'HH:mm:ss') 返回 17:30:00
  • decimalToTime(17.75, 'HH:mm') 返回 17:45
实际应用

这些函数可用于计算工作时长、生成时间报告或在日程系统中处理时间数据。例如,将员工的上下班时间转换为十进制小时以计算工资。


JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

在许多 Web 应用中,处理时间数据是一项常见任务。例如,你可能需要将员工的上下班时间(如 17:00:00 或 17:30)转换为十进制小时(如 17.5)以计算工作时长,或者将十进制小时转换回标准时间格式以显示在界面上。本文将一步步教你如何使用 JavaScript 实现两个函数:一个将 HH:mm:ss 或 HH:mm 格式的时间字符串转换为十进制小时,另一个将十进制小时转换回时间字符串。我们还将探讨这些函数的实际应用场景,并提供健壮的代码实现。

什么是时间转换?

时间转换是指在不同时间表示形式之间切换。HH:mm:ss(小时:分钟:秒)和 HH:mm(小时:分钟)是常见的时间字符串格式,而十进制小时(如 17.5 表示 17 小时 30 分钟)则便于数学计算。例如:

  • 17:30:00 转换为十进制为 17.5(30 分钟 = 0.5 小时)。
  • 17.75 转换回时间为 17:45:00(0.75 小时 = 45 分钟)。

这些转换在时间跟踪、工资计算和数据可视化中非常有用。

函数 1:时间字符串到十进制小时

我们首先实现 timeToDecimal 函数,将时间字符串转换为十进制小时,支持 HH:mm:ss 和 HH:mm 格式。

步骤
  1. 解析时间字符串
    • 使用 split(':') 将字符串分割为小时、分钟和秒(若有)。
    • 检查分割结果的长度:2 表示 HH:mm,3 表示 HH:mm:ss。
  2. 转换为数字
    • 使用 map(Number) 将字符串数组转换为数字数组。
    • 若为 HH:mm,秒默认为 0。
  3. 验证输入
    • 使用正则表达式 /^\d{2}:\d{2}(:\d{2})?$/ 确保格式正确。
    • 检查小时(0-23)、分钟(0-59)、秒(0-59)是否有效。
  4. 计算十进制小时
    • 公式:hours + (minutes / 60) + (seconds / 3600)。
    • 分钟除以 60 转换为小时小数,秒除以 3600 转换为小时小数。
  5. 格式化输出
    • 使用 toFixed(2) 保留 2 位小数,parseFloat 转换为数字。
代码实现

以下是完整的 timeToDecimal 函数:

function timeToDecimal(timeStr) {if (!/^\d{2}:\d{2}(:\d{2})?$/.test(timeStr)) {throw new Error('Invalid time format. Expected HH:mm or HH:mm:ss');}const [hours, minutes, seconds = 0] = timeStr.split(':').map(Number);if (isNaN(hours) || isNaN(minutes) || isNaN(seconds)) {throw new Error('Invalid time values');}if (hours < 0 || hours > 23 || minutes < 0 || minutes > 59 || seconds < 0 || seconds > 59) {throw new Error('Time values out of range');}const decimalTime = hours + (minutes / 60) + (seconds / 3600);return parseFloat(decimalTime.toFixed(2));
}

示例

console.log(timeToDecimal('17:00:00')); // 17.00
console.log(timeToDecimal('17:30:00')); // 17.50
console.log(timeToDecimal('17:45:00')); // 17.75
console.log(timeToDecimal('17:00'));    // 17.00
console.log(timeToDecimal('17:30'));    // 17.50
错误处理
  • 输入 25:00 会抛出错误:Time values out of range。
  • 输入 17:00:00:00 会抛出错误:Invalid time format。
函数 2:十进制小时到时间字符串

接下来,我们实现 decimalToTime 函数,将十进制小时转换回 HH:mm:ss 或 HH:mm 格式,允许用户通过参数选择输出格式。

步骤
  1. 验证输入
    • 确保输入是正数且非 NaN。
  2. 提取小时
    • 使用 Math.floor 获取整数部分作为小时。
  3. 计算分钟
    • 将小数部分乘以 60 得到分钟。
  4. 计算秒(若需要)
    • 将分钟的小数部分乘以 60 得到秒,Math.round 四舍五入。
  5. 处理进位
    • 若秒 ≥ 60,分钟加 1,秒减 60。
    • 若分钟 ≥ 60,小时加 1,分钟减 60。
  6. 格式化输出
    • 使用 padStart(2, '0') 确保小时、分钟、秒为两位数。
    • 根据 format 参数返回 HH:mm:ss 或 HH:mm。
    • 对于 HH:mm,将秒转换为分钟并四舍五入。
代码实现

以下是完整的 decimalToTime 函数:

function decimalToTime(decimalHours, format = 'HH:mm:ss') {if (typeof decimalHours !== 'number' || isNaN(decimalHours) || decimalHours < 0) {throw new Error('Invalid decimal hours');}let hours = Math.floor(decimalHours);let minutesDecimal = (decimalHours - hours) * 60;let minutes = Math.floor(minutesDecimal);let secondsDecimal = (minutesDecimal - minutes) * 60;let seconds = Math.round(secondsDecimal);if (seconds >= 60) {minutes += 1;seconds -= 60;}if (minutes >= 60) {hours += 1;minutes -= 60;}const pad = num => num.toString().padStart(2, '0');if (format === 'HH:mm:ss') {return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;} else if (format === 'HH:mm') {const totalMinutes = Math.round(minutes + seconds / 60);let finalHours = hours;let finalMinutes = totalMinutes;if (totalMinutes >= 60) {finalHours += 1;finalMinutes = 0;}return `${pad(finalHours)}:${pad(finalMinutes)}`;} else {throw new Error('Invalid format. Expected "HH:mm:ss" or "HH:mm"');}
}

示例

console.log(decimalToTime(17.00, 'HH:mm:ss')); // 17:00:00
console.log(decimalToTime(17.50, 'HH:mm:ss')); // 17:30:00
console.log(decimalToTime(17.75, 'HH:mm:ss')); // 17:45:00
console.log(decimalToTime(17.00, 'HH:mm'));    // 17:00
console.log(decimalToTime(17.50, 'HH:mm'));    // 17:30
console.log(decimalToTime(17.752, 'HH:mm'));   // 17:45
错误处理
  • 输入 -1 会抛出错误:Invalid decimal hours。
  • 输入无效格式(如 'HH:mm:xx')会抛出错误:Invalid format。
实际应用场景

这些函数在多种场景中非常实用,以下是一些具体应用:

  1. 时间跟踪与工资计算
    • 场景:员工从 09:00 到 17:30 工作,需计算总工作时长。
    • 示例:
      const start = timeToDecimal('09:00'); // 9.0
      const end = timeToDecimal('17:30');   // 17.5
      const hoursWorked = end - start;      // 8.5
      console.log(`工作时长: ${hoursWorked} 小时`); // 8.5 小时
    • 用途:将小时数乘以小时工资率,计算员工薪资。

  2. 项目管理

    • 场景:跟踪任务时长,生成报告。

    • 示例:将任务时长 7.75 小时转换为 07:45:00 显示在报告中。
      console.log(decimalToTime(7.75, 'HH:mm:ss')); // 07:45:00
  3. 日程系统
    • 场景:检查会议时间是否重叠。
    • 示例:将会议时间转换为十进制小时,比较时间段。
  4. 数据可视化
    • 场景:将时间数据转换为十进制小时,绘制时间轴或柱状图。
    • 示例:使用 Chart.js
      绘制工作时长图表,输入十进制小时数据。
  5. 跨系统集成
    • 场景:某些系统(如 Excel 或数据库)要求十进制小时格式。
    • 示例:将用户输入的 17:30 转换为 17.5 存储到数据库。
性能与注意事项
  • 性能:两个函数计算量小,适合高频调用。对于大批量数据,可缓存解析结果以优化性能。
  • 时区:函数假设输入为本地时间。若需处理多时区,可结合 Date 对象。
  • 精度:toFixed(2) 提供 2 位小数精度,适合大多数场景。若需更高精度,可调整参数。
  • 输入灵活性:函数支持 HH:mm 和 HH:mm:ss,但不支持其他格式(如 5:30 PM)。若需扩展,可添加解析逻辑。
2025 年趋势

截至 2025 年 5 月,JavaScript 仍是前端开发的支柱,时间处理在日程管理、直播系统和数据分析中需求旺盛。这些函数轻量、无需外部依赖,适合直接嵌入项目。若需复杂时间操作,可考虑 day.js 或 date-fns 库,但本实现已足够应对大多数场景。

对比分析

以下表格总结两个函数的特点:

特性timeToDecimaldecimalToTime
输入时间字符串(HH:mm:ss 或 HH:mm)十进制小时(如 17.5),可选格式参数
输出十进制小时(如 17.5)时间字符串(如 17:30:00 或 17:30)
验证正则表达式、范围检查数字类型、有效性检查
错误处理抛出格式或数值错误抛出无效输入或格式错误
主要用途计算时长、数据转换显示时间、生成报告
结论

通过 timeToDecimal 和 decimalToTime 函数,可以轻松实现时间字符串与十进制小时的相互转换。这些函数支持 HH:mm:ss 和 HH:mm 格式,包含健壮的验证和错误处理,适用于时间跟踪、项目管理和数据可视化等场景。希望本文能帮助你快速掌握这些技术,并在实际项目中应用它们。

相关文章:

JavaScript 时间转换:从 HH:mm:ss 到十进制小时及反向转换

关键点 JavaScript 可以轻松实现时间格式&#xff08;HH:mm:ss 或 HH:mm&#xff09;与十进制小时&#xff08;如 17.5&#xff09;的相互转换。两个函数分别处理时间字符串到十进制小时&#xff0c;以及十进制小时到时间字符串的转换&#xff0c;支持灵活的输入和输出格式。这…...

【深度学习】#11 优化算法

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 目录 深度学习中的优化挑战局部极小值鞍点梯度消失 凸性凸集凸函数 梯度下降一维梯度下降学习率局部极小值 多元梯度下降 随机梯度下降随机梯度更新动态学习率…...

《数字藏品APP开发:解锁高效用户身份认证与KYC流程》

开发一款数字藏品APP&#xff0c;要面对诸多复杂且关键的环节&#xff0c;其中&#xff0c;实现高效的用户身份认证与KYC&#xff08;了解你的客户&#xff09;流程&#xff0c;无疑是重中之重。这不仅关乎用户资产安全与平台合规运营&#xff0c;更是构建用户信任、保障平台可…...

ros2中自定义的package查不到?

在ros2中自定义的package功能包&#xff0c;使用命令&#xff1a;ros2 pkg list无法查找到自己的功能包&#xff1f; 首先&#xff0c;利用ros2 pkg create命令创建好功能包之后要利用colcon build命令进行编译&#xff0c;编译成功之后&#xff0c;在当前路径需要运行命令&am…...

根据台账批量制作个人表

1. 前期材料准备 1&#xff09;要有 人员总的信息台账 2&#xff09;要有 个人明白卡模板 2. 开始操作 1&#xff09;打开 人员总的信息台账&#xff0c;选择所需要的数据模块&#xff1b; 2&#xff09;点击插入&#xff0c;选择数据透视表&#xff0c;按流程操作&…...

LocaleContextResolver实现多语言切换-笔记

1. LocaleContextResolver功能简介 org.springframework.web.servlet.LocaleContextResolver是 Spring MVC 中用于解析和管理用户 Locale&#xff08;语言环境&#xff09; 的核心接口。 //LocaleContextResolver 接口定义 public interface LocaleContextResolver extends L…...

Android从单体架构迁移到模块化架构。你会如何设计模块划分策略?如何处理模块间的通信和依赖关系

从单体架构迁移到模块化架构。可能有些小伙伴已经深陷单体架构的泥潭,代码耦合得跟一团麻线似的,改个小功能都能牵一发而动全身;也可能有些团队在协作时,经常因为代码冲突或者职责不清搞得焦头烂额。相信我,这些问题我都经历过,真的能把人逼疯!所以,咱得找个更好的方式…...

Zephyr OS Nordic芯片的Flash 操作

目录 概述 1. 软硬件环境 1.1 软件开发环境 1.2 硬件环境 2 Flash操作库函数 2.1 nRF52832的Flash 2.2 Nordic 特有的 Flash 操作 2.2.1 nrfx_nvmc_bytes_write 函数 2.2.2 nrfx_nvmc_page_erase函数 2.2.3 nrfx_nvmc_write_done_check 函数 3 操作Flash的接口函数…...

uv python 卸载

又是查了半天 官网wiki没有 网上一堆傻子胡说 uv提示也不对 AI还在这尼玛胡编乱造 开始 我原来装了这几个环境 uv python list 现在python3.7.7不需要了&#xff0c;卸载&#xff0c;直接 uv python uninstall 3.7.7 去找你自己要卸载的版本号&#xff0c;不需要整个包名复制…...

MCP本地高效与云端实时:stdio 与 HTTP+SSE 传输机制深度对比

概览 模型上下文协议&#xff08;MCP&#xff09;定义了客户端与服务器之间通信的统一标准&#xff0c;所有消息均采用 JSON-RPC 2.0 格式进行封装&#xff0c;并在此基础上支持两种传输机制&#xff1a;stdio&#xff08;标准输入/输出&#xff09; 与 HTTPSSE&#xff08;Se…...

浮点数截断法:四舍五入的精确模拟

理论解释&#xff1a; 1. 目标 假设 a 3.14159&#xff0c;我们想四舍五入到 小数点后两位&#xff08;即 3.14 或 3.15&#xff09;。 2. 步骤拆解 (1) a * 100 把 a 放大 100 倍&#xff0c;让小数点后两位变成整数部分&#xff1a; 3.14159 * 100 314.159 (2) 0.5 关…...

技术文章:解决汇川MD500系列变频器干扰问题——GRJ9000S EMC滤波器的应用

1. 引言 汇川MD500系列变频器&#xff08;Variable Frequency Drive, VFD&#xff09;以其高性能、宽功率范围&#xff08;0.4kW-500kW&#xff09;和灵活的控制方式&#xff0c;广泛应用于工业自动化领域&#xff0c;如风机、水泵、传送带和压缩机等。然而&#xff0c;MD500系…...

大模型数据分析破局之路20250512

大模型数据分析破局之路 本文面向 AI 初学者、数据分析从业者与企业技术负责人&#xff0c;围绕大模型如何为数据分析带来范式转变展开&#xff0c;从传统数据分析困境谈起&#xff0c;延伸到 LLM MCP 的协同突破&#xff0c;最终落脚在企业实践建议。 &#x1f30d; 开篇导语…...

基于javaweb的SSM驾校管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...

Java内存泄露生产环境排查过程,通透了

昨天线上环境崩了 java堆内存溢出。。。 报错&#xff1a;java.lang.OutOfMemoryError: Java heap space 下面我将我排查问题的思路和过程记录了下来 1. 场景 客户端跟Java服务端通过websocket连接建立长链接并发送语音数据&#xff08;text格式&#xff09;Java服务端跟听…...

NHANES指标推荐:MDS

文章题目&#xff1a;The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI&#xff1a;10.1186/s41043-025-00846-x 中文标题&#xff1a;美国人群镁耗竭评分 &#xff08;MDS&#xff09; 与膀胱过度活动症…...

以项目的方式学QT开发C++(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value &#xff1a;要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器&#xff0c;并对其进行插入、删除和迭代操作。在实际应用中&am…...

Docker使用经验-从Image导出dockerfile并进行修改

好久没进行记录写作了&#xff0c;还是得进行下去 0 前言 项目上拉下来的docker-image在我自己电脑上创建的容器不能正常启动&#xff0c;创建者在容器里面添加的了用户&#xff0c;容器启动后会进入该用户 1 docker导出dockerfile dfimage是一个用于从Docker镜像生成Docker…...

【HTML5学习笔记1】html标签(上)

web标准&#xff08;重点&#xff09; w3c 构成&#xff1a;结构、表现、行为&#xff0c;结构样式行为相分离 结构&#xff1a;网页元素整理分类 html 表现&#xff1a;外观css 行为&#xff1a;交互 javascript html标签 1.html语法规范 1&#xff09; 所有标签都在…...

计算机视觉---目标检测(Object Detecting)概览

一、目标检测定义与核心任务 1. 定义 任务&#xff1a;在图像/视频中定位并分类所有感兴趣目标&#xff0c;输出边界框&#xff08;Bounding Box&#xff09;和类别标签。核心输出&#xff1a; 坐标&#xff1a;((x_1, y_1, x_2, y_2))&#xff08;左上角右下角&#xff09;或…...

在vue3中使用Cesium的保姆教程

1. 软件下载与安装 1. node安装 Vue.js 的开发依赖于 Node.js 环境&#xff0c;因此我们首先需要安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许你在服务器端运行 JavaScript 代码&#xff0c;同时也为前端开发提供了强大的工具支…...

IP地址、端口、TCP介绍、socket介绍、程序中socket管理

1、IP地址&#xff1a;IP 地址就是 标识网络中设备的一个地址&#xff0c;好比现实生活中的家庭地址。IP 地址的作用是 标识网络中唯一的一台设备的&#xff0c;也就是说通过IP地址能够找到网络中某台设备。 2、端口&#xff1a;代表不同的进程,如下图&#xff1a; 3、socket:…...

基于MCP的桥梁设计规范智能解析与校审系统构建实践

引言 在腾讯云开发者社区中&#xff0c;有多种MCP工具可以用于本系统的开发和优化中&#xff0c;以下是一些潜在的应用场景&#xff1a; ‌PDF解析工具‌&#xff1a;如pdfplumber等&#xff0c;可以用于规范文件的预处理&#xff0c;提取文本和图像信息。‌自然语言处理工具…...

搭建运行若依微服务版本ruoyi-cloud最新教程

搭建运行若依微服务版本ruoyi-cloud 一、环境准备 JDK > 1.8MySQL > 5.7Maven > 3.0Node > 12Redis > 3 二、后端 2.1数据库准备 在navicat上创建数据库ry-seata、ry-config、ry-cloud运行SQL文件ry_20250425.sql、ry_config_20250224.sql、ry_seata_2021012…...

OM和SCADA的区别

在工业与能源领域&#xff0c;O&M&#xff08;Operation and Maintenance&#xff0c;运维&#xff09; 和 SCADA&#xff08;Supervisory Control And Data Acquisition&#xff0c;监控与数据采集系统&#xff09; 是两类截然不同的概念&#xff0c;前者是 人员与流程驱动…...

CentOS7 grub配置文件介绍

1. grub2-editenv list saved_entryCentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) 这个命令查询出当前启动的内核版本。 2.grep ^menu /boot/grub2/grub.cfg menuentry CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) --class centos --class gnu-linux --class gnu --c…...

SpringBoot常用注解详解

文章目录 1. 前言2. 核心注解2.1 SpringBootApplication2.2 Configuration2.3 EnableAutoConfiguration2.4 ComponentScan2.5 Bean2.6 Autowired2.7 Qualifier2.8 Primary2.9 Value2.10 PropertySource2.11 ConfigurationProperties2.12 Profile 3. Web开发相关注解3.1 Control…...

Python字符串常用内置函数详解

文章目录 Python字符串常用内置函数详解一、基础字符串函数1. len() - 获取字符串长度2. ord() - 获取字符的Unicode码点3. chr() - 通过Unicode码点获取字符4. ascii() - 获取字符的ASCII表示 二、类型转换函数1. str() - 将对象转为字符串2. repr() - 获取对象的官方字符串表…...

MyBatis 批量新增与删除功能完整教程

一、功能概述 通过 MyBatis 动态 SQL 实现以下功能: 批量新增:一次性插入多条员工记录,支持自增主键回填。批量删除:根据 ID 数组一次性删除多条记录。二、代码逐行解析 1. Mapper 接口定义 // 批量新增:传入员工对象集合 void insertAll(List<Emp> empList);// …...

HTML常用标签用法全解析:构建语义化网页的核心指南

HTML作为网页开发的基石&#xff0c;其标签的合理使用直接影响页面的可读性、SEO效果及维护性。本文系统梳理HTML核心标签的用法&#xff0c;结合语义化设计原则与实战示例&#xff0c;助你构建规范、高效的网页结构。 一、基础结构与排版标签 1.1 文档结构 <!DOCTYPE htm…...