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
感觉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 这种格式,也可以顺便把分隔符改成 -。
这是 toLocaleString 在部分鸿蒙引擎实现下的兼容问题,hour12: false 场景下,会将 0 点格式化为 24。
解决方法:放弃 toLocaleString,改用手动拼接时间:通过 date.getFullYear()、getMonth()+1、getDate()、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.toLocaleString 在 hour12: false 模式下,对于午夜 0 点,部分实现会输出 24(表示前一天的最后一小时)而非 00,这与本地化数据有关,并非代码逻辑错误。
解决方案:手动拼接时间字符串,确保小时始终在 00–23 范围内。
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。


