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/11/12 10:20:01 阅读更多 →
三星推广人物检测算法,儿童芭蕾舞表演场景或更有用武之地

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

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

2026/11/12 2:17:21 阅读更多 →
Arch Linux更新后mkinitcpio -P报错error的解决

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

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

2026/11/3 5:36:31 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻