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

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验证字符类型

本文将DateUtilCharUtil的核心能力综合展示,并给出表单场景下的实战用法。


二、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 格式化占位符

占位符含义示例
YYYY4 位年份2024
MM2 位月份(补零)01~12
DD2 位日期(补零)01~31
HH2 位小时(24时制)00~23
mm2 位分钟00~59
ss2 位秒00~59

CharUtil 检测速查

方法匹配字符
isDigit0-9
isLettera-z A-Z
isUpperCaseA-Z
isLowerCasea-z
isSpaceCharUnicode 空格类字符
isWhitespace空格/Tab/换行/回车
isIdeograph中日韩文字(CJK)
isBlankChar含全角空格的广义空白
isAsciiASCII 0~127

八、小结

DateUtilCharUtil分别解决了时间数据和文本数据的处理需求:

  • DateUtil:格式化、比较、计算——所有日期场景的一站式工具
  • CharUtil:逐字符检测——表单验证、密码强度、输入过滤的基础工具

两者联合使用,可以覆盖 HarmonyOS 应用中绝大多数的数据处理和验证场景。

http://www.cnnetsun.cn/news/2573791.html

相关文章:

  • CANoe实战解析系列 ———— Analysis功能区Graphic窗口的深度配置与高效观测技巧
  • 基于PIC单片机与LED矩阵的智能圣诞树灯光系统设计与实现
  • 基于ESP8266与DHT22的物联网湿度监测系统DIY指南
  • UE5.4角色预览系统:集成MakeHuman与Mixamo的动画重定向实战
  • Postman报FileNotFoundException?其实是URL解码失败
  • AI原生创业公司 |第二篇:Idea阶段——好想法比任何时候都更值钱
  • 3步解锁QQ音乐加密音频:QMCDecode终极指南实现全平台自由播放
  • League Akari:英雄联盟玩家的终极本地化工具箱完整指南
  • 喜马拉雅音频下载终极指南:3步搞定VIP内容本地保存
  • 如何彻底解决Windows磁盘空间不足:WinDirStat磁盘分析神器指南
  • 告别盲扫!用Nmap NSE脚本精准探测Web服务信息(实战演示http-title与http-headers)
  • Unity零基础认知重建:从操作直觉到系统思维
  • 运筹学对偶理论:一个例子帮你彻底搞懂对称形式的转换(附Python代码验证)
  • ROS Melodic/Noetic下image_transport实战:手把手教你配置JPEG/PNG压缩与Theora视频流
  • 如何轻松将B站缓存视频永久保存:m4s转MP4完整教程
  • 零基础手把手:OpenClaw 对接商汤大模型,实现看图 + 聊天 + 绘图
  • 跨平台资源下载神器:3分钟掌握res-downloader的完整使用指南
  • Unity编辑器UI一致性指南:EditorStyles与GUISkin深度解析
  • GitHub终极加速方案:Fast-GitHub让你的下载速度飙升10倍以上
  • Transformer架构解析:从注意力机制到现代大语言模型的核心引擎
  • STM32L051 HAL库串口实战:从零构建中断收发与传感器数据采集
  • 如何5分钟搞定B站缓存视频转换:m4s-converter完整教程
  • drawio-desktop:企业级跨平台图表协作解决方案
  • Azure Blob Storage 生产实战:稳用、安用、省用三大核心原则
  • 【DeepSeek渗透测试实战指南】:20年红队专家亲授5大高危漏洞挖掘技巧与绕过策略
  • 英雄联盟录像编辑神器:5步轻松制作专业游戏视频
  • Layerdivider终极指南:如何免费快速实现专业级图像智能分层
  • 5秒极速转换:m4s-converter帮你永久保存B站珍贵视频
  • t分布实战指南:小样本、未知标准差下的可靠推断
  • ZenTimings:AMD Ryzen内存时序监控终极指南与完整教程