概述

在某些系统版本中,设备系统时间设置为 12 小时制,下午 13:00 发起一条通知,通知栏中显示的时间却是 01:00。这是一个时间格式转换的 bug——系统按 24 小时制处理了时间,但没有根据用户的 12 小时制设置做格式化,导致下午 13点被错误地显示为 01 点。

说明

这个问题的根源在于时间格式化时没有读取系统的时间制式配置。HarmonyOS 中获取系统时间格式的接口是date.getSystemTimeConfiguration() ,它返回的is24Hour 字段标识当前是 24 小时制还是 12 小时制。

在生成通知时,如果直接用new Date().getHours()取小时数再拼接显示,拿到的是 24 小时制的原始值(12 点下午 = 12,1 点下午 = 13),不会自动转换。当  is24Hour为 false 时,需要手动将小时数转换为 12 小时制格式,并追加 AM/PM 标识。

使用实践

通知构建时根据系统配置格式化时间:

import { notification } from '@kit.NotificationKit'

function formatNotificationTime(timestamp: number): string {
  let date = new Date(timestamp)
  let hours = date.getHours()
  let minutes = date.getMinutes()
  let config = date.getSystemTimeConfiguration()
  let period = ''

  if (!config.is24Hour) {
    period = hours >= 12 ? ' PM' : ' AM'
    hours = hours % 12
    if (hours === 0) hours = 12
  }

  let minuteStr = minutes.toString().padStart(2, '0')
  let hourStr = hours.toString().padStart(2, '0')
  return `${hourStr}:${minuteStr}${period}`
}

调用处把格式化好的时间传给通知:

let timeText = formatNotificationTime(Date.now())
notification.publish({
  id: 1,
  content: { notificationContentType: 0, normal: { title: '标题', text: `内容 | ${timeText}` } }
})

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐