HarmonyOS 日期与字符处理综合指南:DateUtil + CharUtil 实战
文章目录
- 一、前言
- 二、DateUtil 核心 API 回顾
- 三、CharUtil 核心 API 回顾
- 四、DateUtil 完整 Demo 演示
- 五、CharUtil 完整 Demo 演示
- 六、组合使用:表单完整验证方案
- 场景:用户注册表单
- 七、日期与字符处理综合参考表
- DateUtil 格式化占位符
- CharUtil 检测速查
- 八、小结
一、前言
近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦
案例demo导航展示
↓↓↓↓↓↓接下来言归正传 ↓↓↓↓
在 HarmonyOS 应用中,日期处理和字符验证是几乎每个项目都会用到的基础能力:
- 注册时间、发布时间、消息时间——需要
DateUtil格式化和计算 - 用户名、密码、手机号——需要
CharUtil验证字符类型
本文将DateUtil和CharUtil的核心能力综合展示,并给出表单场景下的实战用法。
二、DateUtil 核心 API 回顾
// 格式化日期为字符串staticgetFormatDateStr(date,format?:string):string// 获取相对时间描述(刚刚/X分钟前/昨天等)staticgetTipDateStr(date):string// 比较两个日期(返回毫秒差)staticcompareDate(d1,d2,abs?:boolean):number// 比较天数差staticcompareDays(d1,d2,abs?:boolean,digit?:number):number// 判断是否同一天/月/年staticisSameDay(d1,d2):booleanstaticisSameMonth(d1,d2):booleanstaticisSameYear(d1,d2):boolean// 获取某月天数staticgetDaysByMonth(year?:number,month?:number):number// 是否闰年staticisLeapYear(date?):boolean// 获取一周的第几天(0周日~6周六)staticgetWeekDay(date?):number// 前N天/后N天staticgetBeforeDay(day:number,date?):DatestaticgetAfterDay(day:number,date?):Date三、CharUtil 核心 API 回顾
// 是否数字字符staticisDigit(c:string):boolean// 是否字母字符staticisLetter(c:string):boolean// 是否小写字母staticisLowerCase(c:string):boolean// 是否大写字母staticisUpperCase(c:string):boolean// 是否空格字符staticisSpaceChar(c:string):boolean// 是否空白字符(空格、Tab、换行等)staticisWhitespace(c:string):boolean// 是否表意文字(中文/日文/韩文等CJK字符)staticisIdeograph(c:string):boolean// 是否空白字符(包含全角空格)staticisBlankChar(c:string):boolean// 是否ASCII字符(0~127)staticisAscii(c:string):boolean四、DateUtil 完整 Demo 演示
DateUtilDemoPage.ets中的日期格式化演示:
// 格式化日期展示loadFormatDates(){constnow=newDate();// 不同格式的输出this.dateYMD=DateUtil.getFormatDateStr(now,'YYYY-MM-DD');this.dateHMS=DateUtil.getFormatDateStr(now,'HH:mm:ss');this.dateFull=DateUtil.getFormatDateStr(now,'YYYY-MM-DD HH:mm:ss');this.dateCN=DateUtil.getFormatDateStr(now,'YYYY年MM月DD日');// 相对时间constfiveMinutesAgo=newDate(Date.now()-5*60*1000);this.tipDate5Min=DateUtil.getTipDateStr(fiveMinutesAgo);// "5分钟前"constoneHourAgo=newDate(Date.now()-60*60*1000);this.tipDate1Hour=DateUtil.getTipDateStr(oneHourAgo);// "1小时前"constyesterday=DateUtil.getBeforeDay(1);this.tipDateYesterday=DateUtil.getTipDateStr(yesterday);// "昨天"}日期比较演示:
loadDateComparison(){constdate1=newDate('2024-01-01');constdate2=newDate('2024-06-15');this.daysDiff=DateUtil.compareDays(date1,date2,true,0);// 165天this.isSameYear=DateUtil.isSameYear(date1,date2);// truethis.isSameMonth=DateUtil.isSameMonth(date1,date2);// falsethis.addLog('DateCompare',`相差${this.daysDiff}天,同年:${this.isSameYear}`,'info');}日历计算演示:
loadCalendarInfo(){constyear=newDate().getFullYear();// 各月天数for(letm=1;m<=12;m++){constdays=DateUtil.getDaysByMonth(year,m);this.monthDays.push({month:m,days});}// 是否闰年this.isLeapYear=DateUtil.isLeapYear();// 今天是本周第几天constweekDay=DateUtil.getWeekDay();// 0=周日, 1=周一...this.weekDayLabel=['周日','周一','周二','周三','周四','周五','周六'][weekDay];}五、CharUtil 完整 Demo 演示
CacheCharClickDemoPage.ets中的字符检测演示:
checkChar(c:string){if(!c){this.addLog('CharUtil','请输入字符','warn');return;}constresults=[`isDigit:${CharUtil.isDigit(c)}`,`isLetter:${CharUtil.isLetter(c)}`,`isUpperCase:${CharUtil.isUpperCase(c)}`,`isLowerCase:${CharUtil.isLowerCase(c)}`,`isSpaceChar:${CharUtil.isSpaceChar(c)}`,`isWhitespace:${CharUtil.isWhitespace(c)}`,`isIdeograph:${CharUtil.isIdeograph(c)}`,`isBlankChar:${CharUtil.isBlankChar(c)}`,`isAscii:${CharUtil.isAscii(c)}`,];this.addLog('CharUtil',`"${c}" →${results.join(', ')}`,'info');}六、组合使用:表单完整验证方案
场景:用户注册表单
interfaceRegistrationForm{username:string;password:string;birthday:string;}interfaceValidationResult{valid:boolean;message:string;}// 用户名验证(CharUtil)functionvalidateUsername(username:string):ValidationResult{if(!username)return{valid:false,message:'用户名不能为空'};if(username.length<3||username.length>20){return{valid:false,message:'用户名长度应为 3~20 个字符'};}// 检查是否包含非法字符(只允许字母、数字、中文)for(constcofusername){if(!CharUtil.isLetter(c)&&!CharUtil.isDigit(c)&&!CharUtil.isIdeograph(c)){return{valid:false,message:`字符 "${c}" 不合法,仅允许字母/数字/中文`};}}return{valid:true,message:'用户名合法'};}// 密码强度验证(CharUtil)functionvalidatePassword(password:string):ValidationResult{if(password.length<8){return{valid:false,message:'密码长度不能小于 8 位'};}lethasUpper=false,hasLower=false,hasDigit=false;for(constcofpassword){if(CharUtil.isUpperCase(c))hasUpper=true;if(CharUtil.isLowerCase(c))hasLower=true;if(CharUtil.isDigit(c))hasDigit=true;}if(!hasUpper||!hasLower||!hasDigit){return{valid:false,message:'密码需包含大写字母、小写字母和数字'};}return{valid:true,message:'密码强度合格'};}// 生日验证(DateUtil)functionvalidateBirthday(birthday:string):ValidationResult{try{constdate=DateUtil.getFormatDate(birthday);constnow=newDate();// 不能是未来日期if(DateUtil.compareDate(date,now)>0){return{valid:false,message:'生日不能是未来日期'};}// 年龄 18~120 岁constyears=DateUtil.compareDays(date,now,true)/365;if(years<18)return{valid:false,message:'年龄不能小于 18 岁'};if(years>120)return{valid:false,message:'请输入合法日期'};// 格式化显示constformatted=DateUtil.getFormatDateStr(date,'YYYY年MM月DD日');return{valid:true,message:`生日:${formatted}`};}catch{return{valid:false,message:'日期格式不正确'};}}七、日期与字符处理综合参考表
DateUtil 格式化占位符
| 占位符 | 含义 | 示例 |
|---|---|---|
YYYY | 4 位年份 | 2024 |
MM | 2 位月份(补零) | 01~12 |
DD | 2 位日期(补零) | 01~31 |
HH | 2 位小时(24时制) | 00~23 |
mm | 2 位分钟 | 00~59 |
ss | 2 位秒 | 00~59 |
CharUtil 检测速查
| 方法 | 匹配字符 |
|---|---|
isDigit | 0-9 |
isLetter | a-z A-Z |
isUpperCase | A-Z |
isLowerCase | a-z |
isSpaceChar | Unicode 空格类字符 |
isWhitespace | 空格/Tab/换行/回车 |
isIdeograph | 中日韩文字(CJK) |
isBlankChar | 含全角空格的广义空白 |
isAscii | ASCII 0~127 |
八、小结
DateUtil和CharUtil分别解决了时间数据和文本数据的处理需求:
- DateUtil:格式化、比较、计算——所有日期场景的一站式工具
- CharUtil:逐字符检测——表单验证、密码强度、输入过滤的基础工具
两者联合使用,可以覆盖 HarmonyOS 应用中绝大多数的数据处理和验证场景。
