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

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

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

2026/7/24 13:19:37 阅读更多 →
Arch Linux更新后mkinitcpio -P报错error的解决

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

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

2026/7/24 13:18:37 阅读更多 →

最新新闻

OpenCV实战:图像拼接、自动判分与目标提取技术解析

OpenCV实战:图像拼接、自动判分与目标提取技术解析

1. 项目概述计算机视觉技术正在深刻改变我们处理图像信息的方式。作为一名长期从事视觉算法开发的工程师,我发现OpenCV这个开源库在解决实际问题时展现出惊人的灵活性。今天我想通过三个典型场景——图像拼接、试卷自动判分和目标提取,带大家深入理解计算…

2026/7/24 13:27:39 阅读更多 →
大模型在输变配电工程评审中的落地实践——金曲AI评审技术方案解析

大模型在输变配电工程评审中的落地实践——金曲AI评审技术方案解析

在输变配电工程建设领域,传统人工评审模式存在流程繁琐、参数核对量大、规则适配性弱、人为误差率高等痛点。随着行业数字化转型推进,依托大语言模型赋能工程评审全流程,成为解决行业评审效率低、专业性参差不齐问题的关键方向。本文基于Deep…

2026/7/24 13:27:39 阅读更多 →
露易丝·海的诗歌18

露易丝·海的诗歌18

我带着爱意看待过去在我所处的无穷无尽的生命中,一切都完美、完整、完全。我们每一个人,包括我自己,都以对我们来说意义非凡的方式体验着生命的富足和充实。现在,我带着爱意看待过去,选择从过去的经历中学习。没有对错…

2026/7/24 13:27:39 阅读更多 →
细粒度动作质量评估:从技术原理到应用实践

细粒度动作质量评估:从技术原理到应用实践

1. 项目概述:重新定义动作评估的维度 "以人为中心的细粒度动作质量评估"这个课题第一次引起我的注意是在三年前的一次康复训练项目中。当时我们团队需要为术后患者设计一套居家康复动作监测系统,但市面上所有动作识别方案都只能判断"是否…

2026/7/24 13:27:39 阅读更多 →
Anthropic 机器人实验:Agent 能力为何取决于接口抽象层

Anthropic 机器人实验:Agent 能力为何取决于接口抽象层

谈机器人 Agent 时,开发团队很容易先问“该选哪个大模型”。Anthropic 7 月 9 日发布的机器人研究给出了一个更接近工程现实的答案:同一个模型看起来强不强,很大程度取决于它通过什么接口接触物理世界。让模型直接输出关节力矩、让它写控制器…

2026/7/24 13:27:39 阅读更多 →
深入解析SAR ADC典型特性:以ADS8584S为例的高精度数据采集设计指南

深入解析SAR ADC典型特性:以ADS8584S为例的高精度数据采集设计指南

1. 项目概述:为什么我们需要深入理解一颗ADC的“典型特性”?在工业自动化、高端测试仪器或者精密医疗设备的设计中,我们常常会面对一个核心挑战:如何将现实世界中连续变化的物理信号(比如电机电流、传感器电压、生物电…

2026/7/24 13:26:39 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻