HarmonyOS 应用开发《掌上英语》第43篇:日期与时间处理——ArkTS 中的时间工具
日期与时间处理——ArkTS 中的时间工具一、时间处理的常见需求在英语学习应用中时间处理无处不在记录生词添加时间、答题时间戳判断今天是否已经学习过计算连续学习天数生成每日挑战题目的种子周维度统计数据的日期计算ArkTS 基于标准 ECMAScript提供了完整的Date对象 API。本文将通过项目中的实际源码展示常见的日期时间处理模式。二、核心 Date 对象用法2.1 获取当前时间戳Date.now()返回距 1970 年 1 月 1 日的毫秒数是最常用的时间记录方式// NewWordManager 中记录添加时间addTime:Date.now()// AnswerQuestionsPage 中记录答题时间戳currentItem.jlStampDate.now();2.2 格式化日期字符串将 Date 对象转为YYYY-MM-DD格式的字符串用于某天的数据的键值判断// DailyChallengeManager 中获取今天的日期字符串privategetTodayStr():string{letnownewDate();letyearnow.getFullYear();letmonth(now.getMonth()1).toString().padStart(2,0);letdaynow.getDate().toString().padStart(2,0);return${year}-${month}-${day};}这段代码有几点值得注意getMonth()返回 0~11所以需要1padStart(2, 0)确保月份和日期始终为两位数使用模板字符串拼接比连接更清晰2.3 时间戳清零归零到当天 0 点在比较是否为同一天时需要先将时间戳归零到当天 0 点// LearningPlanManager 中的关键操作lettodaynewDate();today.setHours(0,0,0,0);// 设置为当天 00:00:00.000lettodayTimestamptoday.getTime();setHours(0, 0, 0, 0)将时、分、秒、毫秒全部归零这样比较两个 Date 对象的getTime()就能判断它们是否在同一天。三、LearningPlanManager 中的日期计算checkAndUpdateContinuousDays方法展示了完整的天数计算逻辑publiccheckAndUpdateContinuousDays():LearningPlan{letplanthis.getLearningPlan();lettodaynewDate();today.setHours(0,0,0,0);lettodayTimestamptoday.getTime();if(plan.lastStudyDate0){// 首次学习plan.continuousDays1;}else{letlastDatenewDate(plan.lastStudyDate);lastDate.setHours(0,0,0,0);letlastTimestamplastDate.getTime();letdiffDaysMath.floor((todayTimestamp-lastTimestamp)/(1000*60*60*24));if(diffDays0){// 同一天不更新}elseif(diffDays1){// 连续plan.continuousDays;}else{// 中断重置plan.continuousDays1;}}plan.lastStudyDatetodayTimestamp;this.saveLearningPlan(plan);returnplan;}3.1 天数差计算letdiffDaysMath.floor((todayTimestamp-lastTimestamp)/(1000*60*60*24));这个公式的原理两个时间戳相减得到毫秒差1000 * 60 * 60 * 24是一天的毫秒数Math.floor向下取整确保跨天判断准确3.2 连续天数的三种状态diffDays含义操作0同一天不更新防止重复打卡增加天数1连续continuousDays1中断重置为 1四、DailyChallengeManager 中的种子算法每日挑战需要确保同一天内题目固定不变不同天题目不同。这通过日期字符串生成随机种子来实现generateDailyChallenge(allQuestions:TopicItemType[]):void{lettodayStrthis.getTodayStr();// 已存在当日题目直接复用letexistingQuestionsthis.challengeQuestions;if(existingQuestions.length5this.todayCompletedfalse){letfirstKeyexistingQuestions.length0?existingQuestions[0].keyID:;letdateSeedtodayStr.split(-).join();if(firstKey.startsWith(DC_dateSeed)){return;}}// 用日期字符串生成种子letseed0;for(leti0;itodayStr.length;i){seedseed*31todayStr.charCodeAt(i);}seedMath.abs(seed);// 基于种子的 Fisher-Yates 洗牌letcountMath.min(5,allQuestions.length);letselected:TopicItemType[][];letindices:number[][];for(leti0;iallQuestions.length;i){indices.push(i);}for(letiindices.length-1;i0;i--){seed(seed*168077)%2147483647;letjseed%(i1);lettempindices[i];indices[i]indices[j];indices[j]temp;}// ...}这里的种子算法是将日期字符串2026-07-08的每个字符的 charCode 累加乘 31生成一个固定的种子。然后用线性同余法seed (seed * 16807 7) % 2147483647生成伪随机序列。五、统计模块中的周日期计算DashboardManager 在构建周度数据时需要回溯前 6 天privatebuildWeeklyData(plan:LearningPlan):DailyStats[]{letresult:DailyStats[][];letdayLabels:string[][周日,周一,周二,周三,周四,周五,周六];lettodaynewDate();today.setHours(0,0,0,0);for(leti6;i0;i--){letdnewDate(today.getTime()-i*24*60*60*1000);letdateStr(d.getMonth()1).toString()/d.getDate().toString();letdayLabeldayLabels[d.getDay()];// ...}}核心技巧new Date(today.getTime() - i * 24 * 60 * 60 * 1000)通过一天天的毫秒数偏移获取前几天的日期。这比setDate(getDate() - 1)更直观。六、日期格式化的其他方式6.1 笔记添加时间// AnswerQuestionsPage 中记录笔记时间this.topicItemModelPref.addNoteTimenewDate().getTime();6.2 打卡日历月份判断getCheckInCalendarMonth(year:number,month:number):boolean[]{letresult:boolean[]newArray(31).fill(false)asboolean[];letmonthStr${year}-${month.toString().padStart(2,0)}-;for(leti0;ithis.checkInDays.length;i){if(this.checkInDays[i].startsWith(monthStr)){letdayStrthis.checkInDays[i].substring(monthStr.length);letdayparseInt(dayStr,10);if(day1day31){result[day-1]true;}}}returnresult;}利用已存储的YYYY-MM-DD格式字符串通过startsWith和substring精确判断某月某日是否打过卡。七、时间处理最佳实践统一使用时间戳Date.now()或date.getTime()存储避免时区问题比较前清零判断是否为同一天时统一setHours(0,0,0,0)后再比较格式化字符串用于显示时再格式化推荐YYYY-MM-DD格式避免直接操作 Date 字符串优先使用时间戳计算差值最后再转为字符串ArkTS 的 Date API 与标准 JavaScript 保持一致掌握这些模式后任何与时间相关的业务需求都能迎刃而解。

相关新闻

扩散模型加速:全方差公式在DDIM采样中的优化实践

扩散模型加速:全方差公式在DDIM采样中的优化实践

1. 项目背景与核心价值去年在优化一个图像生成项目时,我遇到了扩散模型采样速度慢的老大难问题。当团队尝试用DDIM(Denoising Diffusion Implicit Models)加速生成过程时,发现常规方法在步数缩减到50步以下时,图像质量…

2026/10/17 17:34:26 阅读更多 →
三星推广人物检测算法,儿童芭蕾舞表演场景或更有用武之地

三星推广人物检测算法,儿童芭蕾舞表演场景或更有用武之地

【导语:三星正在向粉丝群体推广一种出色的人物检测算法,该算法可挑选聚焦对象并裁剪视频追踪人物,在儿童芭蕾舞表演场景或更具应用价值。】三星推广人物检测算法三星目前正在向粉丝群体积极推广一种人物检测算法。这种算法具有独特的功能&…

2026/10/17 17:48:32 阅读更多 →
Arch Linux更新后mkinitcpio -P报错error的解决

Arch Linux更新后mkinitcpio -P报错error的解决

Arch Linux更新后进行mkinitcpio应该是SOP标准操作(虽然我记住这个也是因为某次更新kernel之后再启动纯黑屏grub引导都没进去给我吓一跳。今天我sudo pacman -Syu之后mkinitcpio -P发现报错,问了DeepSeek之后发现给的解决方式有点怪,于是我在…

2026/10/17 17:49:34 阅读更多 →

最新新闻

新华DCS组态文件与工程师手册深度解析指南

新华DCS组态文件与工程师手册深度解析指南

简介:本资源为新华DCS系统核心工程资料包,面向工业自动化领域初/中级系统工程师、DCS运维人员及高校控制类专业实践学习者,聚焦系统组态实施与现场调试能力提升。资源包含1份HTML格式的下载说明页(含返币规则与使用提示&#xff0…

2026/10/19 0:51:08 阅读更多 →
UCIe 2.0系统架构深度解析:从芯粒互连到多die管理机制

UCIe 2.0系统架构深度解析:从芯粒互连到多die管理机制

UCIe 2.0规范发布之后,我翻得最多的章节其实是系统架构,而不是物理层波形或者链路层的CRC细节。原因很简单:1.0版本可以用“多芯片串在一起的高速接口标准”来理解,但到2.0,UCIe已经变成一套能管理、能配置、能安全启动…

2026/10/19 0:51:08 阅读更多 →
网管系统交付必读:概述文档、北向接口与告警管理实战指南

网管系统交付必读:概述文档、北向接口与告警管理实战指南

简介:《NCE-T网管操作系统概述》是一份面向华为传送网/微波网管方向的技术文档,适合网络运维工程师、系统集成人员以及对5G承载、网络自动化和智能运维感兴趣的读者。内容围绕NCE-T与U2000的架构对比展开,说明NCE-T如何继承原有管理域与NBI接…

2026/10/19 0:51:07 阅读更多 →
MATLAB与OpenDSS输配电联合仿真:有载调压与馈线调节器协同案例

MATLAB与OpenDSS输配电联合仿真:有载调压与馈线调节器协同案例

简介:这套基于MATLAB与OpenDSS开发的输配电系统联合仿真平台,面向计算机、电子信息工程及数学等专业学生的课程设计、期末大作业与毕业设计,也适合电力领域初学者作为入门工具。平台支持MATLAB 2014、2019a及2024a等多个版本,借助…

2026/10/19 0:50:07 阅读更多 →
大规模MIMO信号检测器MATLAB实战对比:MMSE/TASER/LAMA/ADMIN/KBEST

大规模MIMO信号检测器MATLAB实战对比:MMSE/TASER/LAMA/ADMIN/KBEST

简介:本资源是一套面向通信工程专业学生、科研人员及MATLAB算法开发者的大型MIMO系统信号检测算法仿真代码包,聚焦于解决高维信道下低复杂度、高性能信号恢复这一核心问题。压缩包共22个文件,以20个MATLAB函数(.m)为主…

2026/10/19 0:49:07 阅读更多 →
Win10下Charles抓包实战:从解密HTTPS到手机App调试

Win10下Charles抓包实战:从解密HTTPS到手机App调试

实习第一天,带我的导师丢过来一句话:“把电脑收拾利索,把Charles装上,等会儿联调要抓包看登录接口。”我那时候以为Charles是个什么前端框架,等装完打开才发现,它就是一台架在本机上的HTTP代理服务器&#…

2026/10/19 0:49:07 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →