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

HarmonyOS ArkTS DateUtil 日期增减与日历计算完整指南

文章目录背景一、引言二、日期增减方法详解使用示例三、日历计算方法详解四、Demo 演示日期增减结果展示五、Demo 演示月历视图完整实现六、日历视图关键点解析为什么要填充前置空格getLastDayOfMonth 的实现技巧七、小结背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓一、引言在日历、任务管理、预约系统等应用中经常需要计算明天/昨天/N天后的日期判断是否为闰年获取某月的天数构建月视图日历本月第一天是星期几、本月有几天DateUtil提供了一套完整的日期增减与日历计算方法。二、日期增减方法详解// DateUtil.ets工具类源码// 获取前几天或后几天的日期staticgetAmountDay(date:number|string|Date,amount:number):Date{letrelativeDateDateUtil.getFormatDate(date);relativeDate.setDate(relativeDate.getDate()amount);// 正数后负数前returnrelativeDate;}// 获取前几天或后几天的日期返回字符串staticgetAmountDayStr(date:number|string|Date,amount:number,format:stringDATE_FORMAT4):string{returnDateUtil.getFormatDateStr(DateUtil.getAmountDay(date,amount),format);}// 获取前一天日期staticgetBeforeDay(date:number|string|Date):Date{returnDateUtil.getAmountDay(date,-1);}// 获取前一天日期返回字符串staticgetBeforeDayStr(date:number|string|Date,format:stringDATE_FORMAT4):string{returnDateUtil.getAmountDayStr(date,-1,format);}// 获取后一天日期staticgetAfterDay(date:number|string|Date):Date{returnDateUtil.getAmountDay(date,1);}// 获取后一天日期返回字符串staticgetAfterDayStr(date:number|string|Date,format:stringDATE_FORMAT4):string{returnDateUtil.getAmountDayStr(date,1,format);}使用示例constnownewDate();// 假设今天是 2026-05-19DateUtil.getBeforeDayStr(now)// 2026-05-18昨天DateUtil.getAfterDayStr(now)// 2026-05-20明天DateUtil.getAmountDayStr(now,-7)// 2026-05-127天前DateUtil.getAmountDayStr(now,30)// 2026-06-1830天后DateUtil.getAmountDayStr(now,-365)// 2025-05-19去年今天三、日历计算方法详解// DateUtil.ets工具类源码// 判断是否是闰年staticisLeapYear(year:number|DatenewDate()):boolean{yearyearinstanceofDate?year.getFullYear():year;return(year%40year%100!0)||year%4000;}// 获取指定年份的天数闰年366平年365staticgetDaysByYear(year:number):number{if(DateUtil.isLeapYear(year)){return366;}else{return365;}}// 获取指定月份的天数staticgetDaysByMonth(year:number,month:number):number{if(month2){if(DateUtil.isLeapYear(year)){return29;}else{return28;}}elseif(month1||month3||month5||month7||month8||month10||month12){return31;}else{return30;}}// 获取给定年份和月份的最后一天是几号staticgetLastDayOfMonth(year:number,month:number):number{returnnewDate(year,month,0).getDate();}// 获取给定日期是星期几0周日6周六staticgetWeekDay(date:number|string|Date):number{returnDateUtil.getFormatDate(date).getDay();}// 获取给定日期是当月的第几周staticgetWeekOfMonth(date:number|string|Date):number{letcurrentDateDateUtil.getFormatDate(date);letfirstDayOfMonthnewDate(currentDate.getFullYear(),currentDate.getMonth(),1);letfirstDayOfWeekfirstDayOfMonth.getDay();// 当月第一天是星期几letweekNumberMath.ceil((currentDate.getDate()firstDayOfWeek)/7);returnweekNumber;}四、Demo 演示日期增减结果展示效果演示// DateUtilDemoPage.etsDemo 源码getDateCalcResults():DateCalcResult[]{constnownewDate();return[{label:昨天,value:DateUtil.getBeforeDayStr(now),color:#FF9800},{label:明天,value:DateUtil.getAfterDayStr(now),color:#00C853},{label:7天前,value:DateUtil.getAmountDayStr(now,-7),color:#555},{label:30天后,value:DateUtil.getAmountDayStr(now,30),color:#555},{label:本周第几周,value:DateUtil.getWeekOfMonth(now).toString(),color:#4080FF},{label:本月最后一天,value:DateUtil.getLastDayOfMonth(DateUtil.getNowYear(),DateUtil.getNowMonth()).toString() 号,color:#FF9800},];}// UI 展示ForEach(this.getDateCalcResults(),(r:DateCalcResult){Row(){Text(r.label).fontSize(12).fontColor(#888).width(100)Text(r.value).fontSize(12).fontColor(r.color).fontWeight(FontWeight.Medium)}.width(100%).padding({top:5,bottom:5})},(r:DateCalcResult)r.label)五、Demo 演示月历视图完整实现这是 Demo 中最精彩的部分——用DateUtil实现一个可切换月份的月历视图// DateUtilDemoPage.etsDemo 源码StatecalendarYear:number2026;StatecalendarMonth:number5;// 构建日历格子数据getCalendarCells():CalendarCell[]{constcells:CalendarCell[][];// 获取当月第一天是星期几0周日constfirstDaynewDate(this.calendarYear,this.calendarMonth-1,1).getDay();// 获取当月总天数constdaysInMonthDateUtil.getLastDayOfMonth(this.calendarYear,this.calendarMonth);// 填充首行空格月份前的空白格for(leti0;ifirstDay;i){cells.push({day:0,isToday:false,isWeekend:false});}consttodaynewDate();for(letd1;ddaysInMonth;d){constisTodaydtoday.getDate()this.calendarMonthtoday.getMonth()1this.calendarYeartoday.getFullYear();// 用 DateUtil.isWeekend 判断是否为周末constisWeekendDateUtil.isWeekend(newDate(this.calendarYear,this.calendarMonth-1,d));cells.push({day:d,isToday,isWeekend});}returncells;}// 日历 UI 组件Column(){// 月份切换导航Row(){Button().fontSize(16).height(36).width(44).backgroundColor(#F5F6FA).fontColor(#333).onClick((){if(this.calendarMonth1){this.calendarMonth12;this.calendarYear--;}else{this.calendarMonth--;}})Text(${this.calendarYear}年${this.calendarMonth}月).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#1a1a1a).layoutWeight(1).textAlign(TextAlign.Center)Button().fontSize(16).height(36).width(44).backgroundColor(#F5F6FA).fontColor(#333).onClick((){if(this.calendarMonth12){this.calendarMonth1;this.calendarYear;}else{this.calendarMonth;}})}.width(100%).margin({bottom:8})// 本月信息Text(本月${this.getMonthDays(this.calendarYear,this.calendarMonth)}天第${DateUtil.getWeekOfMonth(newDate(this.calendarYear,this.calendarMonth-1,1))}周开始).fontSize(11).fontColor(#888).margin({bottom:8})// 星期标题行Row(){ForEach([日,一,二,三,四,五,六],(d:string){Text(d).fontSize(12).fontWeight(FontWeight.Medium).fontColor(d六||d日?#FF5252:#888).width(14.28%).textAlign(TextAlign.Center)})}.width(100%).margin({bottom:4})// 日期格子Flex({wrap:FlexWrap.Wrap}){ForEach(this.getCalendarCells(),(cell:CalendarCell){if(cell.day0){Text().width(14.28%).height(40)// 空格}else{Column(){Text(cell.day.toString()).fontSize(14).fontColor(cell.isToday?#FFF:cell.isWeekend?#FF5252:#333).fontWeight(cell.isToday?FontWeight.Bold:FontWeight.Normal)}.width(14.28%).height(40).justifyContent(FlexAlign.Center).backgroundColor(cell.isToday?#4080FF:transparent)// 今日高亮.borderRadius(20)}},(cell:CalendarCell)cell.day.toString()cell.isToday.toString())}}.width(100%).padding(14).backgroundColor(#FFFFFF).borderRadius(12)六、日历视图关键点解析为什么要填充前置空格月历的每一行是 7 列周日到周六。比如 2026 年 5 月 1 日是周五getDay() 5所以前面需要填充 5 个空格让 1 号出现在第 6 列。日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 ...getLastDayOfMonth 的实现技巧staticgetLastDayOfMonth(year:number,month:number):number{returnnewDate(year,month,0).getDate();// 下个月第0天 本月最后一天}// new Date(2026, 5, 0) → 2026年5月0日 → 实际上是4月30日// 所以 getLastDayOfMonth(2026, 4) 30四月有30天七、小结方法说明典型应用场景getAmountDay(date, n)增减 n 天负数为减计算任意相对日期getBeforeDay/getAfterDay前后一天日历翻页isLeapYear(year)判断闰年校验日期合法性getDaysByMonth(y, m)获取月份天数日历构建getLastDayOfMonth(y, m)获取月末日期日历边界判断getWeekDay(date)获取星期几日历列定位getWeekOfMonth(date)获取第几周周视图日历isWeekend(date)判断是否周末日历颜色标注

相关文章:

HarmonyOS ArkTS DateUtil 日期增减与日历计算完整指南

文章目录 背景一、引言二、日期增减方法详解使用示例 三、日历计算方法详解四、Demo 演示:日期增减结果展示五、Demo 演示:月历视图完整实现六、日历视图关键点解析为什么要填充前置空格?getLastDayOfMonth 的实现技巧 七、小结 背景 近期发现…...

千亿镁合金产业集群正在成形:成都、抚州、池州的新版图

一个新赛道的地理坐标 如果要在中国地图上标注一条正在成形的新兴产业集群走廊,高强镁合金这条线,值得被认真画出来。 成都龙泉驿——江西抚州临川——安徽池州高新区,三个坐标,三条生产线,一家公司,两年内…...

新能源车轻量化为什么开始盯上高强镁合金?

续航,是悬在每一台纯电动汽车头上的达摩克利斯之剑。多充一度电、多堆一些正极材料,是一条路;但还有另一条路——把车造得更轻。 SAE(美国汽车工程师学会)的测算已经被反复引用:整车每减重100千克&#xff…...

为内部知识库问答机器人接入Taotoken多模型增强回答效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为内部知识库问答机器人接入Taotoken多模型增强回答效果 构建一个高效的企业内部知识库问答机器人,核心挑战在于如何让…...

航空航天为什么离不开高强镁合金?国产替代到哪一步了

飞机每减重一千克,全年大约节省四千两百美元的燃油费用——这是航空工程师熟悉的经验值。在商业航空领域,这个数字还只是财务账;在战斗机、导弹和卫星的世界里,减重的收益被换算成更远的航程、更大的载荷、更高的机动性&#xff0…...

OpenClaw用户如何快速接入Taotoken并开始Agent工作流

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 OpenClaw用户如何快速接入Taotoken并开始Agent工作流 对于使用OpenClaw框架构建AI智能体的开发者而言,快速接入稳定、多…...

开启Python GUI开发新纪元:Tkinter Designer可视化界面自动化生成终极指南

开启Python GUI开发新纪元:Tkinter Designer可视化界面自动化生成终极指南 【免费下载链接】Tkinter-Designer An easy and fast way to create a Python GUI 🐍 项目地址: https://gitcode.com/gh_mirrors/tk/Tkinter-Designer 在Python GUI开发…...

长期使用Taotoken聚合服务对项目月度账单的可预测性提升

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken聚合服务对项目月度账单的可预测性提升 在AI驱动的项目开发与运营中,成本控制与预算规划是团队管理者…...

FM3773 低功耗离线式恒流/恒压 PSR 控制器

概述 FM3773 是一种高性能的交流/直流用于电池充电器和适配器的电源控制器,内置 850V 功率三极管。该设备采用脉冲频率调制(PFM)的方法来建立非连续导通模式(DCM)反激式电源。 FM3773 提供精确的恒定电压,恒…...

告别浪费!SolidWorks企业级共享方案,实现降本增效全攻略

还在为 SolidWorks 高昂的硬件投入和混乱的图纸管理头疼?告别“一人一机”的浪费模式,企业级共享方案才是降本增效的正解。这套攻略基于“1 台高性能服务器 云飞云共享云桌面”架构,帮你把硬件成本砍掉 60%,把软件利用率翻倍。一…...

炉石传说自动对战助手:5分钟上手,彻底解放双手的终极指南

炉石传说自动对战助手:5分钟上手,彻底解放双手的终极指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为每天重复的炉石…...

ROS Noetic实战:从bag包里‘抠’出雷达点云和IMU数据的保姆级教程(Ubuntu 20.04)

ROS Noetic实战:从bag包里提取雷达点云和IMU数据的完整指南(Ubuntu 20.04)在机器人开发中,ROS bag文件就像是一个装满珍贵数据的宝箱,而雷达点云和IMU数据则是其中最闪亮的宝石。作为一名长期与ROS打交道的开发者&…...

Linux服务器被挖矿木马劫持的五步应急处置指南

1. 这不是“中病毒”,是服务器被劫持成了矿机——先别慌,但必须立刻断网“服务器被黑客攻击,用来挖矿!”——这句话在运维圈里一出,比收到OOM告警还让人头皮发紧。它不像网页被挂马、数据库被拖库那样有明显业务影响&a…...

Windows10下V-REP教育版安装保姆级教程(附百度网盘资源与避坑点)

Windows10系统V-REP教育版完整安装指南:从下载到实战避坑在机器人仿真和自动化控制领域,V-REP(现更名为CoppeliaSim)作为一款功能强大的跨平台机器人仿真软件,已经成为众多工科学生和研究人员的首选工具。特别是其教育…...

美团外卖mtgsig与waimai_sign双层签名逆向解析

1. 这不是“爬虫教程”,而是一份反向工程现场笔记你搜到这篇内容,大概率正卡在某个调试窗口前:抓包看到mtgsig和waimai_sign两个参数像两堵墙,无论怎么改请求头、换UA、清缓存,返回永远是{"code":403,"…...

PentestGPT实战部署指南:AI驱动的渗透测试工作流落地

1. 这不是另一个“AI安全”的概念玩具,而是一套能真正跑起来的渗透测试辅助工作流“PentestGPT”这个名字刚在GitHub上出现时,我第一反应是点开又关掉——过去三年里,我见过太多打着“AI渗透”旗号的项目:有的只是把ChatGPT API封…...

基于ESP32的AIS转WiFi转换器:实现NMEA 0183数据无线传输

1. 项目概述:从VHF-AIS接收器到iPad的无线桥梁作为一名经常在海上折腾电子设备的航海爱好者,我最近遇到了一个挺实际的需求:我的主力导航设备是iPad上的iSailor应用,它功能强大、界面友好,但有个“硬伤”——它需要通过…...

写论文的神助攻!好用的AI写作辅助软件,逻辑清晰质量高

作为一名刚完成毕业论文的过来人,我太懂写论文的痛苦了 —— 选题迷茫、文献浩如烟海、框架混乱、逻辑不清、反复修改、查重降重反复折腾... 直到我发现了这套 AI 写作工具组合,简直是论文写作的 "开挂神器",效率直接拉满&#xff…...

终极免费方案:WandEnhancer完整解锁WeMod Pro功能快速指南

终极免费方案:WandEnhancer完整解锁WeMod Pro功能快速指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否渴望享受WeMod Pro会员的所…...

机器学习与SHAP在教育公平研究中的应用:精准定位学业困境根源

1. 项目概述:当机器学习遇见教育公平,我们如何精准定位学业困境的根源?在拉丁美洲的教育研究领域,一个长期困扰政策制定者和研究者的核心问题是:究竟是什么因素,在复杂的社会经济背景下,系统性地…...

学术写作创新突破!2026全流程AI论文工具精选指南

2026 年 AI 论文写作工具已进入全流程闭环 学术合规时代,千笔 AI(综合评分 99 分)中文学术场景标杆;Grammarly Academic与Elicit为英文论文写作首选;按需求匹配度 - 数据可信度 - 成本承受力三维模型选型,…...

‌2026智慧校园规划必读:如何在预算吃紧下选到高性价比方案‌

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…...

告别鼠标手!5分钟上手开源鼠标连点器MouseClick,轻松实现自动化点击

告别鼠标手!5分钟上手开源鼠标连点器MouseClick,轻松实现自动化点击 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软…...

VMware ESXi 9.1.0.0集成NVME+网卡驱动版发布|新特性+驱动集成+部署升级+FAQ全指南

一、ESXi 9.1.0.0 正式版核心新特性 VMware ESXi 9.1.0.0(2026 年 5 月发布)是 vSphere 9.1 核心组件,聚焦硬件兼容扩展、性能跃升、安全加固、运维简化四大方向,重点强化 NVMe 存储与网卡生态适配,以下为关键更新&am…...

FeHelper前端助手:30+开发工具集,让你的浏览器变身效率神器

FeHelper前端助手:30开发工具集,让你的浏览器变身效率神器 【免费下载链接】FeHelper 😍FeHelper--Web前端助手(Awesome!Chrome & Firefox & MS-Edge Extension, All in one Toolbox!) 项目地址:…...

为什么软件开发偏爱 Linux?深度剖析 Linux 相较于 Windows 的核心优势

引言 在软件开发的世界里,一个有趣的现象是:无论是大型互联网公司的服务器集群,还是资深程序员的个人开发机,Linux 操作系统的身影无处不在。与之形成鲜明对比的是,尽管 Windows 在个人消费市场占据绝对主导地位&…...

钱钟书《围城》第1-5章阅读笔记:一场关于人生困境的提前预演

前言 钱钟书先生的《围城》被誉为"新儒林外史",是中国现代文学史上风格独特的讽刺经典。这部创作于20世纪40年代的长篇小说,以抗战初期为背景,通过主人公方鸿渐的人生轨迹,深刻揭示了知识分子群体的精神困境与人性弱点。…...

从CTF题看RSA安全:为什么你的密钥不能‘共享素数’?

从CTF实战看RSA密钥安全:那些年我们踩过的坑 在网络安全竞赛和实际渗透测试中,RSA算法的错误实现方式往往成为突破的关键点。本文将通过典型CTF赛题案例,揭示五种常见RSA实现漏洞背后的数学原理和安全启示,帮助开发者在实际项目中…...

如何让Rhino 3D模型在Blender中保持完整数据:import_3dm插件深度解析

如何让Rhino 3D模型在Blender中保持完整数据:import_3dm插件深度解析 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 当建筑师需要在Blender中渲染Rhino设计的建筑模…...

《我看见的世界:李飞飞自传》第1-6章阅读笔记:从移民少女到AI教母的“看见“之旅

前言 当我们谈论人工智能时,我们谈论的是算法、数据、算力,是那些冰冷的代码和复杂的模型。但在《我看见的世界:李飞飞自传》中,李飞飞用她独特的视角告诉我们:AI的本质,是人类对"看见"世界的渴望…...