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

HarmonyOS ArkTS DateUtil intl 国际化格式化完整指南

文章目录

    • 概述
    • 一、两种格式化方式的对比
    • 二、getFormatTime:intl 日期时间格式化
      • DateTimeOptions 常用配置
      • 格式化效果演示
    • 三、getFormatRange:时间段格式化
    • 四、getFormatRelativeTime:相对时间格式化
      • 相对时间效果演示
    • 五、Demo 演示代码
    • 六、常用格式模板对比
    • 七、自定义模板 vs intl 格式化的选择建议
    • 八、小结

概述

近期发现一款很有意思的HarmonyOS 三方库, 地址 @pura/harmony-utils(V1.4.0) , 作者是"桃花镇童长老", 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦

案例demo导航展示

↓↓↓↓↓↓接下来言归正传 ↓↓↓↓

一、两种格式化方式的对比

DateUtil提供了两套日期格式化方案:

方案方法特点
自定义模板格式化getFormatDateStr(date, format)使用yyyy-MM-dd HH:mm:ss模板,简单直观
intl 国际化格式化getFormatTime/getFormatRelativeTime使用intl.DateTimeFormat,支持多语言、多地区格式

二、getFormatTime:intl 日期时间格式化

// DateUtil.ets(工具类源码)/** * 格式化时间日期字符串(DateTimeFormat) * @param date 时间日期对象 * @param options 时间日期格式化选项 * @param locale 包含区域设置信息的字符串(如 "zh-CN") */staticgetFormatTime(date:Date,options:intl.DateTimeOptions={dateStyle:"short",timeStyle:"short",hourCycle:"h24"},locale:string="zh-CN"):string{constdateTimeFormat=newintl.DateTimeFormat(locale,options);returndateTimeFormat.format(date);}

DateTimeOptions 常用配置

属性可选值说明
dateStyle"full"/"long"/"medium"/"short"日期显示样式
timeStyle"full"/"long"/"medium"/"short"时间显示样式
hourCycle"h11"/"h12"/"h23"/"h24"小时制
year"numeric"/"2-digit"年份格式
month"numeric"/"2-digit"/"long"/"short"/"narrow"月份格式
day"numeric"/"2-digit"日期格式
weekday"long"/"short"/"narrow"星期格式

格式化效果演示

constnow=newDate('2026-05-19 20:30:45');// short 格式(默认)DateUtil.getFormatTime(now,{dateStyle:'short',timeStyle:'short'});// 输出(zh-CN): "2026/5/19 20:30"// full 格式DateUtil.getFormatTime(now,{dateStyle:'full',timeStyle:'medium'});// 输出(zh-CN): "2026年5月19日星期二 20:30:45"// 仅显示日期(long 格式)DateUtil.getFormatTime(now,{dateStyle:'long'});// 输出(zh-CN): "2026年5月19日"// 英文格式DateUtil.getFormatTime(now,{dateStyle:'full',timeStyle:'short'},'en-US');// 输出: "Tuesday, May 19, 2026 at 8:30 PM"// 自定义组合(年月日 + 星期)DateUtil.getFormatTime(now,{year:'numeric',month:'long',day:'numeric',weekday:'long'});// 输出(zh-CN): "2026年5月19日星期二"

三、getFormatRange:时间段格式化

// DateUtil.ets(工具类源码)staticgetFormatRange(startDate:Date,endDate:Date,options:intl.DateTimeOptions={dateStyle:"short",timeStyle:"short",hourCycle:"h24"},locale:string="zh-CN"):string{constdateTimeFormat=newintl.DateTimeFormat(locale,options);returndateTimeFormat.formatRange(startDate,endDate);}
// 使用示例:活动时间段展示conststart=newDate('2026-05-19 09:00:00');constend=newDate('2026-05-19 18:00:00');DateUtil.getFormatRange(start,end,{timeStyle:'short'});// 输出(zh-CN): "09:00 – 18:00"// 跨天活动conststart2=newDate('2026-05-19 20:00:00');constend2=newDate('2026-05-21 22:00:00');DateUtil.getFormatRange(start2,end2,{dateStyle:'medium',timeStyle:'short'});// 输出(zh-CN): "2026年5月19日 20:00 – 2026年5月21日 22:00"

四、getFormatRelativeTime:相对时间格式化

// DateUtil.ets(工具类源码)/** * 格式化相对时间 * @param value 相对时间格式化的数值(负数=过去,正数=未来) * @param unit 单位: "year"|"quarter"|"month"|"week"|"day"|"hour"|"minute"|"second" * @param options 格式化选项 * @param locale 语言区域 */staticgetFormatRelativeTime(value:number,unit:string,options?:intl.RelativeTimeFormatInputOptions,locale:string="zh-CN"):string{letrelativeTimeFormat=newintl.RelativeTimeFormat(locale,options);returnrelativeTimeFormat.format(value,unit);}

相对时间效果演示

// 过去时间(负数)DateUtil.getFormatRelativeTime(-3,'day');// "3天前"DateUtil.getFormatRelativeTime(-1,'hour');// "1小时前"DateUtil.getFormatRelativeTime(-30,'minute');// "30分钟前"DateUtil.getFormatRelativeTime(-1,'month');// "上个月"DateUtil.getFormatRelativeTime(-1,'year');// "去年"// 未来时间(正数)DateUtil.getFormatRelativeTime(3,'day');// "3天后"DateUtil.getFormatRelativeTime(1,'week');// "下周"DateUtil.getFormatRelativeTime(2,'month');// "2个月后"DateUtil.getFormatRelativeTime(1,'year');// "明年"// 英文格式DateUtil.getFormatRelativeTime(-3,'day',undefined,'en-US');// "3 days ago"DateUtil.getFormatRelativeTime(1,'week',undefined,'en-US');// "next week"

五、Demo 演示代码

// DateUtilDemoPage.ets(Demo 源码)// intl.DateTimeFormat 格式化展示Column(){Text('intl.DateTimeFormat 格式化').fontSize(13).fontColor('#666').fontWeight(FontWeight.Medium).alignSelf(ItemAlign.Start).margin({bottom:8})Row(){Text('getFormatTime:').fontSize(11).fontFamily('monospace').fontColor('#D63384')Text(DateUtil.getFormatTime(newDate(),{dateStyle:'full',timeStyle:'medium'})).fontSize(11).fontColor('#555').margin({left:4})}.width('100%').padding({top:4,bottom:4})Row(){Text('getFormatRelativeTime:').fontSize(11).fontFamily('monospace').fontColor('#D63384')Text(DateUtil.getFormatRelativeTime(-3,'day')).fontSize(11).fontColor('#555').margin({left:4})}.width('100%').padding({top:4,bottom:4})}.width('100%').padding(14).backgroundColor('#FFFFFF').borderRadius(12)

六、常用格式模板对比

Demo 中展示了多种getFormatDateStr模板:

// DateUtilDemoPage.ets(Demo 源码)getFormatExamples():FormatExample[]{constnow=newDate();return[{pattern:'yyyy-MM-dd',result:DateUtil.getFormatDateStr(now,'yyyy-MM-dd'),desc:'标准日期'},{pattern:'yyyy-MM-dd HH:mm:ss',result:DateUtil.getFormatDateStr(now,'yyyy-MM-dd HH:mm:ss'),desc:'完整时间'},{pattern:'HH:mm:ss',result:DateUtil.getFormatDateStr(now,'HH:mm:ss'),desc:'仅时间'},{pattern:'yyyy年MM月dd日',result:DateUtil.getFormatDateStr(now,'yyyy年MM月dd日'),desc:'中文格式'},{pattern:'yyyy/MM/dd',result:DateUtil.getFormatDateStr(now,'yyyy/MM/dd'),desc:'斜杠分隔'},{pattern:'yyyy-MM-dd fff',result:DateUtil.getFormatDateStr(now,'yyyy-MM-dd fff'),desc:'含毫秒'},];}

七、自定义模板 vs intl 格式化的选择建议

场景推荐方案原因
数据存储/传输getFormatDateStr格式固定,便于解析
界面显示(固定中文)getFormatDateStr简单直接
国际化多语言应用getFormatTime自动适配地区格式
动态区间显示getFormatRange自动处理同日/跨日格式
社交类相对时间getFormatRelativeTime“3天前” 比 “2026-05-16” 更友好

八、小结

DateUtil的国际化格式化方法基于 HarmonyOSintl模块,遵循 ECMA-402 国际化标准:

  • getFormatTime:支持 4 种样式(full/long/medium/short)+ 自定义组合
  • getFormatRange:自动处理时间段,同日/跨日格式各不同
  • getFormatRelativeTime:输出自然语言风格的相对时间

对于面向全球用户的应用,建议用getFormatTime替代硬编码的getFormatDateStr,让系统根据用户语言自动选择最合适的日期格式。

http://www.jsqmd.com/news/884318/

相关文章:

  • 3步掌握开源Verilog仿真:从概念到实战的完整思维重塑
  • 3D打印产业布道者再创纪录!创想生态 M1amp;R1 狂揽5340万,登顶2026全球3D打印众筹榜首
  • Token Plan 套餐如何帮助项目在预算内实现模型调用自由
  • 进程/线程?并发/并行?
  • 2026年港澳通行证照片手机拍摄保姆级教程:规格要求与拍摄方法详解
  • WSABuilds终极指南:在Windows 10/11上轻松运行Android应用
  • 企业网盘与个人网盘选购指南:20款云盘深度解析
  • 免费开源视频剪辑的终极指南:Avidemux如何让视频处理变得简单高效
  • 题解:AcWing 4548 猴子和香蕉
  • 5. 迁移学习
  • 机器学习加速PIC仿真:MLP与CNN在等离子体初始条件预测中的应用
  • 长期使用感受,Taotoken的API服务稳定性与低延迟体验记录
  • 终极高效音乐歌词提取方案:跨平台批量下载与格式转换全解析
  • 从API密钥管理界面看Taotoken在安全与权限管控上的设计
  • 基于Python的规则引擎:从零构建症状筛查聊天机器人
  • 如何永久保存微信聊天记录:WeChatMsg完整备份方案指南
  • NVIDIA H100 GPU架构与vLLM框架优化实践
  • 3个实用技巧教你用kepano-obsidian模板打造高效个人知识管理系统
  • 登录界面存在问题-------验证码不会自动更新
  • 2026学生党平价控油蓬松洗发水权威推荐榜 - 品牌评测官
  • 【深度解读】中央定调!“人工智能+”全面实施,开发者如何抓住AI产业化与产业AI化的时代红利?
  • 5分钟实现Honey Select 2完整本地化:一站式游戏体验增强方案
  • 机器学习回归模型在政策冲击下股市预测的实战对比:线性回归、SVR、随机森林与kNN
  • 鸿蒙PC:Qt适配OpenHarmony实战【人名录】:单机联系人卡片,不读系统通讯录也能演示详情联动
  • 你的差异基因结果可靠吗?用R包MetaVolcanoR做个Meta分析来验证和增强发现
  • 从所有权机制到产业重构:Rust语言的十年演进与生态全景
  • 2026年5月亨得利官方售后网点实地考察与权威评测报告(含新增与迁址门店) - 亨得利钟表维修中心
  • Windows流媒体服务器SRS终极部署指南:5分钟搭建高性能视频传输系统
  • Windows安卓应用安装新方案:APK安装器如何实现原生级体验?
  • Taotoken 在多模型聚合场景下的路由与容灾机制解析