【HarmonyOS】时间处理Dayjs

背景


在项目中经常会使用要时间的格式转换,比如数据库返回一个Date数据,你需要转成2024-10-2的格式,鸿蒙的原生SDK中是没有办法实现的,因此,在这里介绍第三方封装好并且成熟使用的库Dayjs。

安装


切换到Entry文件夹下安装dayjs库。

cd .\entry\
ohpm install dayjs

查看oh-package.json5 文件,可以查看是否安装成功

dayjs使用


格式化

  • 基本格式化使用
let time: Date = new Date();
this.message = dayjs(time).format();

默认是 ISO8601 格式的字符串:输出 ‘YYYY-MM-DDTHH:mm:ssZ’ 格式

  • 自定义格式化使用

可以在使用占位符加自定义的字眼来实现自己要的特定效果

          let time: Date = new Date();
          this.message = dayjs(time).format("YYYY年MM月DD日");

  • 占位符格式化
    • ‘YYYY’ 表示四位数的年份。
    • ‘YY’ 表示两位数的年份。
    • ‘M’ 表示从1到12。
    • ‘MM’ 表示两位数的月份。
    • ‘MMM’ 表示月份缩写。
    • ‘D’ 表示月份中的天数
    • ‘DD’ 表示两位数的日。
    • ‘d’ 一周中的天数,星期天为0,星期一为1
    • ‘HH’ 表示两位数的小时(24小时制)。
    • ‘hh’ 表示12小时制的两位小时数
    • ‘mm’ 表示两位数的分钟。
    • ‘ss’ 表示两位数的秒。

支持以上的占位符

          let time: Date = new Date();
          this.message = dayjs(time).format("YYYY-MM-DD");

如果需要格式化YY的字符时,可以使用 [YY] 中括号包括。

时间操作

  • 添加时间

使用add方法,传入数值和时间单位,可以实现时间的增加

Button("点击增加时间")
        .width("80%")
        .margin({ top: 20 })
        .onClick(() => {
          this.OneDay = dayjs(this.OneDay).add(1, "day").toDate();
          this.message = dayjs(this.OneDay).format("YYYY-MM-DD");
        })
  • 减少时间

使用subtract方法,传入数值和时间单位,可以实现时间的减少,再通过todate方法来实现date的更新。

      Button("点击减少时间")
        .width("80%")
        .margin({ top: 20 })
        .onClick(() => {
          this.OneDay = dayjs(this.OneDay).subtract(1, "day").toDate();
          this.message = dayjs(this.OneDay).format("YYYY-MM-DD");
        })
  • 时间单位

    • 年(‘year’)
    • 月(‘month’)
    • 周(‘week’)
    • 天(‘day’)
    • 小时(‘hour’)
    • 分钟(‘minute’)
    • 秒(‘second’)
  • 时间比较

使用IsBefore方法可以判断day.js对象是否在另一个提供的日期时间之前。(毫秒级别)

使用IsSame方法可以判断day.js对象是否和另一个提供的时间相同。(毫秒级别)

使用IsAfter方法可以判断day.js对象是否在另一个提供的时间之后。(毫秒级别)

上面三种提供时间查询的方法可以将时间单位作为第二个参数传入,可以实现除毫秒以外的单位进行比较。例如,增加了一天,然后查询两个时间年份是否相同,返回结果是true,如果不加单位则为false。

Button("点击测试时间相同")
        .width("80%")
        .margin({ top: 20 })
        .onClick(() => {
          let temp = dayjs(this.OneDay).subtract(1, "day");
          this.message = `${dayjs(this.OneDay).isSame(temp, 'year')}`;
        })

插件使用


  • AdvancedFormat: 提供更多格式化选项,如季度、Unix 时间戳等。
  • RelativeTime: 用于显示时间的相对表示,如“2小时前”。
  • IsBefore, IsAfter: 用于比较日期。
  • Locale: 支持本地化,允许 Day.js 以用户所在地的语言显示日期。
  • Duration: 用于创建和操作时间段。
  • Timezone: 支持时区转换功能。
  • WeekOfYear, IsoWeek: 用于处理周数的插件,与国际标准或本地习惯相匹配。
  • MinMax: 用于获取一组日期中的最小或最大日期。
  • ToObject, ToArray: 分别将 Day.js 对象转换为 JSON 对象或数组。
  • IsToday:可以判断当前day.js对象是不是今天
<think>好的,我现在需要回答用户关于在鸿蒙系统中将时间戳转换为可读时间的问题。首先,我得确认用户提到的鸿蒙系统具体是哪个版本,因为不同版本可能有不同的API。根据用户提供的引用内容,他们提到了HarmonyOS NEXT和鸿蒙开发5.0,所以应该主要针对这些较新的版本。 接下来,我需要整理用户提供的引用信息。引用[1]提到了systemDateTime和时间格式化相关的Date和DateTimeFormat类。引用[2]讨论了如何获取用户选择的时间并转换格式。引用[3]介绍了使用dayjs库进行时间格式化,而引用[4]则提到了自定义函数和字符串填充方法padStart()和padEnd()。这些信息都是有用的,我需要将它们整合到回答中。 首先,我应该介绍系统自带的DateTimeFormat类,这是官方推荐的方法,可能更高效和稳定。需要说明如何使用这个类来格式化时间戳,包括代码示例。例如,将时间戳转换为Date对象,然后用DateTimeFormat进行格式化。这里要注意时间戳的单位,是秒还是毫秒,鸿蒙可能默认使用毫秒,所以可能需要乘以1000的处理,但要看具体API的文档。 其次,用户提到了第三方库dayjs,这是一个轻量级的时间处理库,可能在鸿蒙中需要安装或引入。需要给出使用dayjs的步骤,比如安装命令和示例代码。同时,需要说明dayjs的优点,比如支持更多自定义格式,适合复杂需求。 然后,用户引用[4]提到自定义函数,使用padStart方法来处理日期数字的填充,比如月份和日期补零。这部分需要给出一个自定义函数的例子,展示如何手动分解时间戳的各个部分,并格式化成字符串。需要注意的是,这种方式可能需要处理时区问题,而鸿蒙的Date类可能默认使用系统时区,但用户是否需要考虑时区转换呢?如果用户的问题中没有提到时区,可能暂时不需要深入,但可以简单提及。 另外,用户可能关心不同方法的优缺点。系统API可能更高效,但格式化选项有限;dayjs更灵活但增加依赖;自定义函数灵活但维护成本高。需要总结这些点,帮助用户根据情况选择。 最后,生成相关问题,可能涉及不同方法的比较、时区处理、性能优化等。确保问题贴合用户可能的后续疑问。 现在,我需要检查步骤是否正确,确保代码示例正确,比如DateTimeFormat的用法是否正确,是否需要处理时区,以及时间戳的单位是否正确。例如,JavaScript中通常使用毫秒,而其他语言可能用秒,所以转换时需要注意。鸿蒙的API文档如果说明时间戳是毫秒,则不需要调整,否则可能需要乘以1000。 此外,确保引用标记正确对应到用户提供的引用内容,比如引用[1]、[3]、[4]对应的内容是否准确应用在回答中。例如,使用系统API的部分引用[1]和[2],第三方库引用[3],自定义函数引用[4]。 最后,语言要简洁明了,分步骤说明,帮助用户一步步实现转换,并给出不同方法的适用场景。</think>### 鸿蒙系统时间戳转换为可读时间的格式化方法 在鸿蒙系统中,时间戳转换为可读时间可通过以下三种方法实现,具体选择取决于开发需求: --- #### 1. **使用系统原生API(DateTimeFormat)** 鸿蒙系统提供了`DateTimeFormat`类,可直接格式化时间戳。时间戳通常以毫秒为单位,需注意单位转换[^1][^2]。 **代码示例:** ```javascript // 时间戳(假设为毫秒级) let timestamp = 1717228800000; // 转换为Date对象 let date = new Date(timestamp); // 使用DateTimeFormat格式化 let formattedTime = DateTimeFormat.format(date, { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }); console.log(formattedTime); // 输出:2024/06/01 00:00:00 ``` **说明**: - `DateTimeFormat`支持自定义格式参数,如`numeric`(数字格式)、`2-digit`(两位补零)。 - 若时间戳为秒级,需先乘以1000转换为毫秒[^2]。 --- #### 2. **使用第三方库dayjs(轻量级推荐)** 通过引入`dayjs`库,可简化复杂的时间格式化操作[^3]。 **步骤:** 1. **安装dayjs** ```bash npm install dayjs ``` 2. **代码示例** ```javascript import dayjs from 'dayjs'; let timestamp = 1717228800000; let formattedTime = dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss'); console.log(formattedTime); // 输出:2024-06-01 00:00:00 ``` **优势**: - 支持灵活格式(如`YYYY-MM-DD`或`HH:mm:ss`)。 - 可扩展时区、相对时间等功能。 --- #### 3. **自定义格式化函数(手动处理)** 若需完全控制格式,可通过`Date`对象拆分时间字段并拼接字符串,使用`padStart()`补零[^4]。 **代码示例:** ```javascript function formatTimestamp(timestamp) { const date = new Date(timestamp); const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}`; } console.log(formatTimestamp(1717228800000)); // 输出:2024-06-01 00:00 ``` **适用场景**: - 无第三方库依赖的轻量化需求。 - 需要定制特殊格式(如“08月”而非“08”)。 --- ### 方法对比 | 方法 | 优点 | 缺点 | |--------------|-------------------------------|-----------------------| | 系统API | 高效、官方维护 | 格式灵活性较低 | | dayjs | 灵活、功能丰富 | 需额外引入依赖 | | 自定义函数 | 完全控制格式 | 代码量较大,需处理细节 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baobao熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值