HarmonyOS 鸿蒙Next中关于日期时间转换问题

HarmonyOS 鸿蒙Next中关于日期时间转换问题  代码如下:

//src/main/ets/utils/queUtil.ets

/**
 * 当前时间
 * @returns
 */
public static getDateTime(): string {
  let date = new Date();
  let dateText: string = date.toLocaleString('zh-CN', {
          year: 'numeric',
          month: '2-digit',
          day: '2-digit',
          hour: '2-digit',
          minute: '2-digit',
          second: '2-digit',
          hour12: false
  });
  return dateText;
}

返回的结果是:2026/04/23 24:56:19,24小时??哪里出错了?


更多关于HarmonyOS 鸿蒙Next中关于日期时间转换问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

感觉hour12设置成false,应该表示用1-24表示小时,也就是hourCycle:'h24’的效果。可以将hour12: 'false’替换成hourCycle: ‘h23’,这样返回结果就变成了2026/04/23 00:56:19。

更多关于HarmonyOS 鸿蒙Next中关于日期时间转换问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你代码没“写错”,这是 toLocaleString('zh-CN') 在部分环境下的本地化实现差异:当 hour12: false 且小时到达午夜附近时,有的 ICU/系统区域格式会用 h24(1–24) 的小时制,导致 00:xx 被显示成 24:xx(比如 00:56 显示成 24:56)。

解决办法(推荐)

显式指定小时制为 h23(0–23):

public static getDateTime(): string {
  const date = new Date();
  return date.toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false,
    hourCycle: 'h23' // 强制 00-23
  });
}

兜底方案(最稳,不依赖本地化实现)

自己拼字符串,永远不会出现 24 点:

public static getDateTime(): string {
  const d = new Date();
  const pad = (n: number) => n.toString().padStart(2, '0');
  return `${d.getFullYear()}/${pad(d.getMonth() + 1)}/${pad(d.getDate())} ` +
         `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
}

如果你希望输出是 2026-04-23 00:56:19 这种格式,也可以顺便把分隔符改成 -

应该是 Arkts 对 toLocaleString 的实现跟JS的差异上有区别。

建议换成手动拼接的方式:

示例代码

export class TestDate {
  static getDateTime(): string {
    let date = new Date();
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = date.getDate();
    let hour = date.getHours();
    let minute = date.getMinutes();
    let second = date.getSeconds();
    
    let dateText = `${year}/${TestDate.pad(month)}/${TestDate.pad(day)} ${TestDate.pad(hour)}:${TestDate.pad(minute)}:${TestDate.pad(second)}`;
    return dateText;
  }

  static pad(num: number): string {
    return num < 10 ? '0' + num : num.toString();
  }
}

这是 toLocaleString 在部分鸿蒙引擎实现下的兼容问题,hour12: false 场景下,会将 0 点格式化为 24

解决方法:放弃 toLocaleString,改用手动拼接时间:通过 date.getFullYear()getMonth()+1getDate()getHours() 等方法获取各字段,再用 padStart(2, '0') 补零拼接,可彻底避免格式异常。

你的代码在获取 00:00:00 ~ 00:59:59 确定是会出现你这种情况的, 其他时段是没问题的 建议换个其他方式获取当前时间

formatDateNumToStr(): string{
       let time = new Date()
       let year = time.getFullYear()
       let month = String(time.getMonth() + 1).padStart(2, "0")
       let day = String(time.getDate()).padStart(2, "0")
       let hours = String(time.getHours()).padStart(2, "0")
       let minutes = String(time.getMinutes()).padStart(2, "0")
       let seconds = String(time.getSeconds()).padStart(2, "0")
       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
    }

系统 API的问题吧,是不是在 00:00:00 ~ 00:59:59 就会错误输出 24:xx:xx,建议别用toLocaleString

改成这样

public static getDateTime(): string {
  const date = new Date();

  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hour = String(date.getHours()).padStart(2, '0');
  const minute = String(date.getMinutes()).padStart(2, '0');
  const second = String(date.getSeconds()).padStart(2, '0');

 
  return `${year}/${month}/${day} ${hour}:${minute}:${second}`;
}

在HarmonyOS Next中,日期时间转换应使用ArkTS标准库。可通过 Date 对象进行基本转换,或调用 @ohos.i18n 模块的 DateTimeFormat 进行国际化格式化。例如:new Intl.DateTimeFormat('zh-CN', options).format(date)。注意时区处理可使用 @ohos.datetime 中的TimezoneUtil

原因:Date.toLocaleStringhour12: false 模式下,对于午夜 0 点,部分实现会输出 24(表示前一天的最后一小时)而非 00,这与本地化数据有关,并非代码逻辑错误。

解决方案:手动拼接时间字符串,确保小时始终在 0023 范围内。

public static getDateTime(): string {
  const date = new Date();
  const year = date.getFullYear();
  const month = (date.getMonth() + 1).toString().padStart(2, '0');
  const day = date.getDate().toString().padStart(2, '0');
  const hour = date.getHours().toString().padStart(2, '0');
  const minute = date.getMinutes().toString().padStart(2, '0');
  const second = date.getSeconds().toString().padStart(2, '0');
  return `${year}/${month}/${day} ${hour}:${minute}:${second}`;
}

这样可稳定输出 2026/04/23 00:56:19

回到顶部