HarmonyOS DateUtil 日期比较与相对时间:getTipDateStr 深度解析
文章目录引言一、为什么需要日期比较二、基础比较方法2.1 compareDate — 毫秒级差值2.2 compareDays — 天数差值2.3 同一年/月/周/日判断2.4 isToday — 是否是今天2.5 isWeekend — 是否是周末三、核心亮点getTipDateStr 相对时间四、完整日期比较 Demo五、快捷判断 UI六、API 速查表七、小结引言近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓一、为什么需要日期比较在应用开发中日期比较的场景无处不在消息列表两条消息是否在同一天决定是否显示日期分割线日历组件哪些日期是今天哪些是周末任务管理任务是否已超期社区帖子显示3分钟前而不是绝对时间戳数据分析两个时间点相差多少天DateUtil提供了一套完整的日期比较和计算方法覆盖上述所有场景。二、基础比较方法2.1 compareDate — 毫秒级差值staticcompareDate(date1:number|string|Date,date2:number|string|Date,abs:booleanfalse):number{constdateTime1:numberDateUtil.getFormatDate(date1).getTime();constdateTime2:numberDateUtil.getFormatDate(date2).getTime();constdiffdateTime2-dateTime1;returnabs?Math.abs(diff):diff;}返回值date2 - date1的毫秒差值正数date2 更晚负数date1 更晚abstrue返回绝对值示例constmsDateUtil.compareDate(2026-05-19,2026-05-20);// ms 864000001天的毫秒数constms2DateUtil.compareDate(2026-05-20,2026-05-19);// ms2 -86400000date1 更晚constms3DateUtil.compareDate(2026-05-20,2026-05-19,true);// ms3 86400000绝对值2.2 compareDays — 天数差值staticcompareDays(date1:number|string|Date,date2:number|string|Date,abs:booleanfalse,digit:number2):number{letdiffDateUtil.compareDate(date1,date2,abs)/(24*3600*1000);if(digit0){diffNumberUtil.keepDecimals(diff,digit);}returndiff;}返回值天数差支持小数默认保留 2 位示例DateUtil.compareDays(2026-05-19,2026-05-22)// 3.00DateUtil.compareDays(2026-05-19,2026-05-19 12:00:00)// 0.50差半天2.3 同一年/月/周/日判断staticisSameYear(date1,date2):boolean// 同一年staticisSameMonth(date1,date2):boolean// 同一月同年且同月staticisSameWeek(date1,date2):boolean// 同一周staticisSameDay(date1,date2):boolean// 同一天同年同月同日示例DateUtil.isSameYear(2026-01-01,2026-12-31)// trueDateUtil.isSameMonth(2026-05-01,2026-05-31)// trueDateUtil.isSameMonth(2026-05-31,2026-06-01)// falseDateUtil.isSameDay(2026-05-19 09:00,2026-05-19 23:59)// true2.4 isToday — 是否是今天staticisToday(date:number|string|Date):boolean{lettodayDateUtil.getTodayStr(DATE_FORMAT4);letdayDateUtil.getFormatDateStr(date,DATE_FORMAT4)returntodayday;}应用场景判断消息/帖子是否是今天发的决定显示今天还是具体日期。2.5 isWeekend — 是否是周末staticisWeekend(date?:number|string|Date):boolean{constdayDateUtil.getFormatDate(date).getDay();//0(周日) 到 6(周六)returnday0||day6;//周六(6)或周日(0)都视为周末}应用场景日历组件中周末日期显示红色。三、核心亮点getTipDateStr 相对时间这是DateUtil最具特色的方法staticgetTipDateStr(date:number|string|Date):string{lettimeMsDateUtil.getFormatDate(date).getTime();if(timeMs.toString().length10){timeMstimeMs*1000//如果是10位的时间戳转化为13位的}letdateNownewDate();letdateUpnewDate(timeMs);if(dateNow.getTime()-timeMs60*1000){return刚刚;}elseif(dateNow.getTime()-timeMs60*60*1000){return((dateNow.getTime()-timeMs)/(60*1000)).toFixed()分钟前;}elseif(dateNow.getTime()-timeMs24*60*60*1000){return((dateNow.getTime()-timeMs)/(60*60*1000)).toFixed()小时前;}elseif(dateNow.getTime()-timeMs360*24*60*60*1000){returnDateUtil.getFormatDateStr(dateUp,MM月dd日);}else{returnDateUtil.getFormatDateStr(dateUp,yyyy-MM-dd);}}转换规则时间差显示效果 1 分钟刚刚1-60 分钟N分钟前1-24 小时N小时前1-360 天MM月dd日如05月19日 360 天yyyy-MM-dd如2025-05-19Demo 中的展示Row(){Column(){Text(DateUtil.getTipDateStr(DateUtil.getTodayTime())).fontSize(14).fontColor(#1a1a1a)Text(当前时间).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Column(){Text(DateUtil.getTipDateStr(DateUtil.getBeforeDay(newDate()))).fontSize(14).fontColor(#1a1a1a)Text(昨天).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Column(){Text(DateUtil.getTipDateStr(DateUtil.getAfterDay(newDate()))).fontSize(14).fontColor(#1a1a1a)Text(明天).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Column(){Text(DateUtil.getTipDateStr(DateUtil.getAmountDay(newDate(),-30))).fontSize(14).fontColor(#1a1a1a)Text(30天前).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)}四、完整日期比较 DemodoCompare(){try{constmsDateUtil.compareDate(this.compareDate1,this.compareDate2);constdaysDateUtil.compareDays(this.compareDate1,this.compareDate2);constsameYearDateUtil.isSameYear(this.compareDate1,this.compareDate2);constsameMonthDateUtil.isSameMonth(this.compareDate1,this.compareDate2);constsameDayDateUtil.isSameDay(this.compareDate1,this.compareDate2);constsameWeekDateUtil.isSameWeek(this.compareDate1,this.compareDate2);constisWeekend1DateUtil.isWeekend(this.compareDate1);constisWeekend2DateUtil.isWeekend(this.compareDate2);this.compareResult相差${ms}ms;this.diffDaysResult相差${days.toFixed(2)}天\n同一年:${sameYear?✅:❌}| 同月:${sameMonth?✅:❌}| 同日:${sameDay?✅:❌}| 同周:${sameWeek?✅:❌}\ndate1周末:${isWeekend1?✅:❌}| date2周末:${isWeekend2?✅:❌};this.addLog(Compare,this.diffDaysResult.split(\n)[0],success);}catch(e){this.compareResult错误:${(easError).message};this.addLog(Compare,比较失败:${(easError).message},error);}}五、快捷判断 UIRow(){Column(){Text(DateUtil.isToday(newDate())?✅:❌).fontSize(20)Text(isToday(今天)).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Column(){Text(DateUtil.isWeekend(newDate())?✅:❌).fontSize(20).fontColor(DateUtil.isWeekend(newDate())?#FF5252:#00C853)Text(isWeekend()).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)Column(){Text(DateUtil.isLeapYear()?✅:❌).fontSize(20)Text(isLeapYear()).fontSize(11).fontColor(#888)}.layoutWeight(1).alignItems(HorizontalAlign.Center)}六、API 速查表方法说明compareDate(d1, d2, abs?)毫秒差值d2-d1compareDays(d1, d2, abs?, digit?)天数差值小数默认2位isSameYear(d1, d2)是否同一年isSameMonth(d1, d2)是否同一月isSameWeek(d1, d2)是否同一周isSameDay(d1, d2)是否同一天isToday(date)是否是今天isWeekend(date?)是否是周末周六/周日isLeapYear(year?)是否是闰年getTipDateStr(date)获取相对时间字符串刚刚/N分钟前/…七、小结DateUtil的日期比较功能覆盖了从毫秒级精度到人性化显示的完整链条精确比较compareDate毫秒、compareDays天数带小数语义比较isSameDay、isSameWeek、isSameMonth、isSameYear状态判断isToday、isWeekend、isLeapYear相对时间getTipDateStr将时间差转为刚刚/N分钟前等人性化文案这些方法是构建日历、消息列表、社区帖子等功能的基础工具。