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,让系统根据用户语言自动选择最合适的日期格式。
