ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用 JavaScript 计算今天已过去的秒数:getSecondsToday 实战与原理解析

用 JavaScript 计算今天已过去的秒数:getSecondsToday 实战与原理解析 文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载今天从零点开始已经过去了多少秒这类“当日进度”计算在倒计时、签到统计、日报生成、页面活跃度上报等场景中非常常见。本指南以 Modern JavaScript Tutorialen.javascript.infoDate and time 一章中的经典练习 6-get-seconds-today 为骨架完整讲解getSecondsToday()的两种实现方案并结合仓库中 11-date 系列题解深入剖析时间戳、Date减法、时区与夏令时等底层原理。读完你将能够独立写出任意日期分量计算函数并理解其在真实项目中的适用边界。题目定义返回今日已过去的秒数原题 task.md 要求如下编写函数getSecondsToday()返回从今天 0 点开始到当前时刻所经过的秒数。例如假设现在是上午10:00且没有夏令时切换则getSecondsToday() 36000 // (3600 * 10)函数必须在任何一天都能正常工作即“今天”不能被硬编码。这个要求包含两个关键点结果必须可推导验证10 点 10 × 3600 36000 秒说明答案是一个精确整数且毫秒部分要么被忽略、要么被四舍五入处理不得硬编码不能写return 36000或任何与“当前日期”无关的常量必须基于运行时刻动态计算。解法一构造今日零点做毫秒差仓库官方题解 solution.md 给出的第一种思路是先构造一个“今天的 00:00:00”的Date对象再用当前时间减去它得到毫秒差最后除以 1000 转为秒。function getSecondsToday() { let now new Date(); // 用当前的年/月/日构造一个零点对象时分秒默认均为 0 let today new Date(now.getFullYear(), now.getMonth(), now.getDate()); let diff now - today; // 毫秒差 return Math.round(diff / 1000); // 转为秒 } alert( getSecondsToday() );关键细节拆解1. 构造零点对象的三个参数new Date(now.getFullYear(), now.getMonth(), now.getDate())使用了 article.md 中讲解的带组件构造语法。根据该章说明year应为 4 位数字此处getFullYear()正好返回 4 位年份month从 0 开始计数0 代表 1 月11 代表 12 月getMonth()的返回值可直接复用date实际是“日”省略hours/minutes/seconds/ms时它们默认取 0。因此new Date(now.getFullYear(), now.getMonth(), now.getDate())恰好表示“今天的 00:00:00.000”并且自动使用本地时区——这正是后面减法结果正确的关键。2.now - today为什么是毫秒差题解注释为 “ms difference”其原理在 article.md 的 “Date to number, date diff” 一节中有明确说明当Date对象被转换为数值时它会变成与date.getTime()等价的时间戳自 1970-01-01 UTC0 起的毫秒数。因此两个Date相减得到的就是二者时间戳的差值单位为毫秒。示例中直接展示过let date new Date(); alert(date); // 毫秒数等价于 date.getTime()3. 为什么要Math.round毫秒差除以 1000 后通常带有小数例如 09:00:00.500 会产生 32400.5 秒。题目示例getSecondsToday() 36000是一个严格相等的整数断言因此官方解法用Math.round做四舍五入。注意这与“向下取整”不同如果你需要“整秒数从 0 开始计”用Math.floor也说得通但跟随官方语义Math.round是最稳妥的选择。为什么这个方法天然正确处理“任何一天”由于today是从now动态取出的年、月、日重新构造的每当跨过午夜、月份更替或年份更替函数都会自动跟随当前日期无需任何分支判断。这也正是题目强调“today is not hardcoded”的用意所在。解法二取时分秒分量直接换算官方 solution.md 给出的第二种思路更轻量分别取出当前的小时、分钟、秒换算成秒后求和。function getSecondsToday() { let d new Date(); return d.getHours() * 3600 d.getMinutes() * 60 d.getSeconds(); } alert( getSecondsToday() );两种解法的对比维度解法一毫秒差解法二分量换算核心 APIgetFullYear()、getMonth()、getDate()、日期减法getHours()、getMinutes()、getSeconds()计算思路时间戳相减 → 毫秒 → 秒分秒换算后求和代码行数略多更短是否包含毫秒通过Math.round处理天然忽略毫秒向下截断适用场景理解时间戳与Date减法快速、直观、贴近“时:分:秒”思维两种解法在无夏令时切换的普通日子里结果几乎一致差异仅在于毫秒的四舍五入与截断。getHours()等组件访问方法的完整列表含getFullYear、getMonth、getDate、getMinutes、getSeconds、getMilliseconds见 article.md 的 “Access date components” 一节。时区、夏令时与边界讨论本地时区语义article.md 特别强调“上述所有组件访问方法都返回相对本地时区的值”例如getHours()返回本地时区的小时getUTCHours()才返回 UTC0 的小时此外getTimezoneOffset()可返回本地时区与 UTC 的分钟差。getSecondsToday()的两种解法都基于本地时区组件构造/换算因此“今日零点”与“当前时刻”属于同一时区语义减法结果天然正确无需手工处理 UTC 偏移。夏令时DST的隐患仓库中姊妹题 7-get-seconds-to-tomorrow 的官方题解在文末专门给出警告请注意许多国家存在夏令时DST因此有些日子可能有 23 小时或 25 小时。遇到这样的日子可能需要单独处理。这个提醒同样适用于本题需要分情况分析解法一毫秒差由于它不假设一天是 86400 秒而是直接计算“零点时间戳”与“当前时间戳”的真实差值在 DST 切换当天依然能给出正确结果——例如春季跳钟日“00:00 → 01:00 → 03:00”实际已过 2 小时即 7200 秒毫秒差法会如实返回 7200解法二分量换算h * 3600 m * 60 s隐含了“每小时 3600 秒”的假设。在 DST 跳钟当天若按“墙上时钟”的小时数换算会与实际流逝时间产生 1 小时偏差。因此如果你的业务运行在实行夏令时的地区且需要精确反映真实流逝时间优先选用解法一如果只是展示“当前时刻在 24 小时刻度上的位置”比如时钟进度条解法二即可满足。本题原题明确限定“no daylight savings shift”的前提两种解法都符合题目预期。举一反三同一家族的日期计算题getSecondsToday()是 11-date 章节练习题链中的一环理解它的两种解法后可以顺带掌握同族的其他题目形成完整的“当日/跨日秒数计算”能力距离明天还有多少秒getSecondsToTomorrow7-get-seconds-to-tomorrow 要求计算到明天零点的秒数其官方题解 solution.md 给出了对称的毫秒差方案function getSecondsToTomorrow() { let now new Date(); // 明天的日期getDate()1 依赖 Date 的自动修正autocorrection特性 let tomorrow new Date(now.getFullYear(), now.getMonth(), now.getDate() 1); let diff tomorrow - now; // 毫秒差 return Math.round(diff / 1000); // 转为秒 }这里now.getDate() 1能正确处理月末与年末正是利用了 article.md “Autocorrection” 一节介绍的越界自动修正特性例如 1 月 32 日会被自动校正为 2 月 1 日。如果把getSecondsToday()与getSecondsToTomorrow()相加在非 DST 日子里恰好等于 86400——两者互为“今日已过”与“今日剩余”。相对时间格式化formatDate8-format-date-relative 进一步要求按“距今小于 1 秒显示 right now、小于 1 分钟显示 n sec. ago、小于 1 小时显示 m min. ago、否则显示 DD.MM.YY HH:mm”的规则格式化日期。它的核心同样是毫秒差比较alert( formatDate(new Date(new Date - 1)) ); // right now alert( formatDate(new Date(new Date - 30 * 1000)) ); // 30 sec. ago这组题目放在一起构成了一个完整的“时间差 → 人类可读表示”工具链getSecondsToday()解决“今天进度”getSecondsToTomorrow()解决“剩余时间”formatDate()解决“相对时间展示”。自检与验证写完函数后建议做以下验证确保在任何一天、任何时区都稳定零点边界在 00:00:00 附近运行结果应接近 0Math.round下可能为 0示例验证在整点如 10:00运行应得到10 * 3600 36000跨日验证在 23:59:59 附近运行结果应接近 86399/86400非 DST 日时区漂移验证将系统时区切换为 UTC14、UTC-12 等极端时区后再次运行结果应保持一致——这正是因为两种解法都基于本地时区组件零点与当前时刻始终同源类型断言题目以getSecondsToday() 36000为例确保返回值是number而非字符串。小结getSecondsToday()的核心思想是“今日零点时间戳 与 当前时间戳 的毫秒差 ÷ 1000”对应官方题解 solution.md 的方案一也可用“时:分:秒 → 秒”的分量换算快速实现方案二代码更短、更直观理解Date转数值即为时间戳毫秒、组件构造默认补零、autocorrection 自动修正越界值是吃透本题乃至整个 Date and time 章节的前提在实行夏令时的地区若需精确反映真实流逝秒数应优先选用基于毫秒差的实现。赞分享文档/教程前端【免费下载链接】en.javascript.infoModern JavaScript Tutorial项目地址https://gitcode.com/gh_mirrors/en/en.javascript.info点击查看免费下载相关推荐Modern JavaScript Tutorial 实战用 Date 对象精确计算今天已流逝的秒数getSecondsTodayModern JavaScript Tutorial 实战用 Date 对象精确计算今天已流逝的秒数getSecondsToday 本篇文章围绕 en文档/教程前端在 JavaScript 中计算昨天、今天与明天的日期Date 对象日期偏移实战指南在 JavaScript 中计算昨天、今天与明天的日期Date 对象日期偏移实战指南 在 Web 开发中展示昨天/今天/明天对应的日期是最常见的日期需求教程文档JavaScript 计算到明天还剩多少秒Date 减法与 DST 边界实战Modern JavaScript TutorialJavaScript 计算到明天还剩多少秒Date 减法与 DST 边界实战Modern JavaScript Tutorial 导读 本篇围绕 Mode文档/教程前端上一篇PotPlayer百度翻译插件终极免费字幕实时翻译解决方案下一篇猫抓扩展一站式MPD/DASH流媒体资源解析与下载解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表