一、引言

时间选择是移动端应用中不可或缺的基础交互之一。闹钟应用中设置提醒时间、日程管理中选择会议开始时间、健身应用中设定训练时长——这些场景都需要一个高效、直观的时间选择器。在传统开发中,实现时间选择需要处理滚轮交互、时间格式化、范围限制、12/24 小时制切换等细节,开发成本不低。

HarmonyOS 提供了 TimePicker 组件——一个内置完整时间选择逻辑的滚轮式时间选择器。它支持 12 小时制和 24 小时制自由切换、循环滚动、时间范围限制、文本样式定制,通过声明式 API 即可完成复杂的时间选择交互。开发者只需绑定一个 Date 对象并监听 onChange 回调,TimePicker 负责剩下的所有 UI 和交互细节。

本文通过一个闹钟设置 Demo 深入讲解 TimePicker 组件的核心用法:如何绑定选中时间?如何切换 12/24 小时制?如何实现循环滚动?以及如何与闹钟列表联动,构建一个完整的闹钟管理功能。

阅读完本文,你将能够:

  • 使用 TimePicker 替代自建时间选择方案
  • 掌握 selected 构造函数参数和 TimePickerResult 回调类型
  • 使用 useMilitaryTime() 控制 12/24 小时制显示
  • 使用 loop() 启用循环滚动
  • 理解 onChange 回调与状态联动的实现模式
  • 构建完整的闹钟增删改查功能

二、TimePicker 组件 API 总览

2.1 构造函数

TimePicker(options?: TimePickerOptions)

TimePickerOptions 包含以下可选参数:

interface TimePickerOptions {
  selected?: Date;        // 默认选中时间,默认当前系统时间
  format?: TimePickerFormat; // 时间格式(12h 或 24h),API 10 起已废弃,改用 useMilitaryTime()
  start?: Date;           // 可选的最早时间(API 24+)
  end?: Date;             // 可选的最晚时间(API 24+)
}
参数 类型 默认值 说明
selected Date 当前系统时间 初始选中的时间
format TimePickerFormat - 已废弃,改用 useMilitaryTime()
start Date - 可选择的最早时间(API 24+)
end Date - 可选择的最晚时间(API 24+)

2.2 链式方法

// 12/24 小时制切换
.useMilitaryTime(value: boolean): TimePickerAttribute

// 是否循环滚动
.loop(value: boolean): TimePickerAttribute

// 时间变化回调
.onChange(callback: Callback<TimePickerResult>): TimePickerAttribute

// 文本样式(通过通用属性)
.fontSize(value: number | string | Resource): TimePickerAttribute
.fontColor(value: ResourceColor): TimePickerAttribute
方法 说明
useMilitaryTime(boolean) true 为 24 小时制,false 为 12 小时制(默认 false
loop(boolean) 是否循环滚动(默认 true),即 23:59 后可继续滚到 00:00
onChange(Callback<TimePickerResult>) 用户选择新时间时的回调,参数为 TimePickerResult 对象

2.3 TimePickerResult 类型

interface TimePickerResult {
  hour: number;    // 小时(0-23)
  minute: number;  // 分钟(0-59)
  second?: number; // 秒(可选,部分设备支持)
}

注意:onChange 的回调参数是 TimePickerResult 而非 Date,与 DatePicker 的 onDateChange 不同。hour 始终返回 0-23 的小时数(不受 12h/24h 显示模式影响),minute 返回 0-59 的分钟数。

2.4 TimePicker vs 自建时间选择方案

特性 TimePicker 自建方案
滚轮交互 内置(系统级体验) 需用 Scroll + Column 手动实现
12/24h 切换 一行 .useMilitaryTime() 需手动处理显示逻辑
循环滚动 一行 .loop(true) 需手动处理边界跳转
时间范围限制 start/end 参数(API 24+) 需手动校验
样式定制 有限(textStyle/selectedTextStyle) 完全自由
与系统时间同步 自动 需手动获取系统时间

TimePicker 适合标准时间选择场景(闹钟、预约、提醒),自建方案适合需要高度定制 UI(如时钟表盘式选择)的场景。
在这里插入图片描述

三、Demo 设计:闹钟设置

3.1 功能概述

Demo 是一个闹钟设置页面,模拟手机闹钟应用的核心功能:

  1. 时间选择:通过 TimePicker 滚轮选择小时和分钟
  2. 12/24 小时制切换:Toggle 开关控制 TimePicker 的显示模式
  3. 添加闹钟:点击按钮将当前选中的时间添加到闹钟列表
  4. 闹钟列表管理:查看所有闹钟,支持启用/禁用和删除操作
  5. 状态统计:显示已启用闹钟数量
  6. 空状态提示:无闹钟时显示引导文案
  7. 自动标签:根据闹钟数量自动分配标签(起床、上班、午休、运动、学习、睡觉)

3.2 交互点

# 交互 说明
1 TimePicker 滚轮选择 滚动选择小时和分钟,实时显示格式化后的时间
2 12/24 小时制 Toggle 切换 TimePicker 显示模式和文字格式
3 添加闹钟按钮 将当前选中时间添加到闹钟列表
4 闹钟启用/禁用 Toggle 控制每条闹钟的启用状态,影响显示样式和计数
5 删除闹钟 从列表中移除指定闹钟
在这里插入图片描述

四、完整代码实现

4.1 数据模型定义

interface AlarmItem {
  id: number;
  hour: number;
  minute: number;
  enabled: boolean;
  label: string;
}

AlarmItem 是闹钟的数据模型,包含唯一 ID、小时、分钟、启用状态和标签。使用接口定义确保类型安全。

4.2 状态变量

@State selectedHour: number = 7;
@State selectedMinute: number = 30;
@State useMilitaryTime: boolean = true;
@State alarms: AlarmItem[] = [];
@State nextId: number = 1;
@State selectedDate: Date = new Date(2025, 0, 1, 7, 30);

关键状态说明:

  • selectedHour / selectedMinute:当前 TimePicker 选中的小时和分钟,用于显示格式化时间
  • useMilitaryTime:控制 TimePicker 的 24 小时制显示
  • alarms:闹钟列表,使用 @State 装饰器确保数据变化触发 UI 更新
  • selectedDate:绑定到 TimePicker 的 Date 对象,注意年份和月份会被忽略,只有小时和分钟有效
  • nextId:自增 ID 生成器

4.3 TimePicker 核心配置

TimePicker({
  selected: this.selectedDate
})
  .useMilitaryTime(this.useMilitaryTime)
  .loop(true)
  .onChange((value: TimePickerResult) => {
    this.selectedHour = value.hour;
    this.selectedMinute = value.minute;
    this.selectedDate = new Date(2025, 0, 1, value.hour, value.minute);
  })

逐行解析:

  • selected: this.selectedDate:将 TimePicker 与一个 Date 对象绑定。TimePicker 只使用 Date 中的小时和分钟。当 Date 对象变化时(通过 onChange 更新),TimePicker 也会自动同步显示。
  • .useMilitaryTime(this.useMilitaryTime)true 显示 24 小时制(0-23),false 显示 12 小时制(上午/下午 + 1-12)。通过 @State 变量动态切换,切换时 TimePicker 自动重新渲染。
  • .loop(true):启用循环滚动。当用户滚到 23:59 继续向下滚时会回到 00:00,反之亦然。这在设置闹钟时非常实用——用户无需回滚一大段才能从一个极端值到达另一个极端值。
  • .onChange():每次用户滚动 TimePicker 到新时间时触发。回调参数是 TimePickerResult 类型,包含 hourminute 属性。我们在回调中更新三个状态:selectedHourselectedMinute(供 Text 组件显示格式化时间用),以及 selectedDate(维持与 TimePicker 的双向绑定)。

注意onChange 回调中的 hour 始终返回 0-23 的数值,不受 useMilitaryTime 显示模式的影响。也就是说,即使 TimePicker 显示为"下午 5:30",value.hour 仍然是 17。

4.4 时间格式化工具

formatTime(h: number, m: number): string {
  if (this.useMilitaryTime) {
    return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`;
  }
  const ampm = h >= 12 ? '下午' : '上午';
  const h12 = h % 12 === 0 ? 12 : h % 12;
  return `${ampm} ${h12}:${m.toString().padStart(2, '0')}`;
}

formatTime 方法根据当前 useMilitaryTime 状态格式化时间字符串:

  • 24 小时制:格式如 07:3014:05
  • 12 小时制:格式如 上午 7:30下午 2:05

注意 padStart(2, '0') 确保分钟始终两位数,小时在 24 小时制下也两位数。12 小时制下的小时转换逻辑:h % 12 注意 0 点和 12 点特殊处理,12 % 12 = 0 时需要显示 12。

4.5 闹钟增删改

addAlarm() {
  const presetIdx = this.alarms.length % this.alarmPresets.length;
  this.alarms = this.alarms.concat([{
    id: this.nextId,
    hour: this.selectedHour,
    minute: this.selectedMinute,
    enabled: true,
    label: this.alarmPresets[presetIdx]
  }]);
  this.nextId++;
}

deleteAlarm(id: number) {
  this.alarms = this.alarms.filter(a => a.id !== id);
}

toggleAlarm(id: number) {
  this.alarms = this.alarms.map(a => {
    if (a.id === id) {
      return {
        id: a.id,
        hour: a.hour,
        minute: a.minute,
        enabled: !a.enabled,
        label: a.label
      } as AlarmItem;
    }
    return a;
  });
}

三个操作都遵循 ArkTS @State 的不可变更新模式——创建新数组而非修改原数组

  • addAlarm():使用 concat() 在数组末尾追加新闹钟。标签通过 alarms.length % alarmPresets.length 循环分配预设标签(起床、上班、午休、运动、学习、睡觉),保证不同闹钟有不同的默认标签。
  • deleteAlarm(id):使用 filter() 过滤掉指定 ID 的闹钟,返回新数组。
  • toggleAlarm(id):使用 map() 遍历数组,对匹配 ID 的闹钟创建一个启用状态取反的新对象,其余保持不变。

重要:ArkTS 禁止使用对象展开运算符 (...) 和数组展开运算符进行浅拷贝(arkts-no-spread)。必须显式构造新对象的每个属性,或使用 concat() 替代 [...arr, item]

4.6 计算属性

get enabledCount(): number {
  return this.alarms.filter(a => a.enabled).length;
}

enabledCount 是一个 getter 计算属性,返回当前启用的闹钟数量。在 UI 中直接使用 this.enabledCount 即可获取实时数值,无需额外的 @State 变量。

4.7 UI 结构

build() {
  Column() {
    // 标题栏
    Row() {
      Text('⏰ 闹钟设置')
        .fontSize(FontSize.HEADLINE)
        .fontColor('#FFFFFF')
        .fontWeight(FontWeight.Bold)
    }
    .width('100%').height(52)
    .padding({ left: Spacing.LG, right: Spacing.LG })
    .backgroundColor('#1a1a2e')

    Scroll() {
      Column() {
        // 1. 说明卡片
        // 2. TimePicker 显示区 + 格式化时间
        // 3. 添加按钮 + 24h Toggle
        // 4. 闹钟列表(有数据时显示)
        // 5. 空状态(无数据时显示)
      }
    }
    .layoutWeight(1)
    .backgroundColor('#F2F3F5')
  }
}

页面采用"标题栏 + 滚动内容区"的标准布局。内容区从上到下依次排列:组件介绍卡片 → TimePicker 展示区 → 操作按钮 → 闹钟列表或空状态。Scroll 确保内容较长时可以滚动查看。

4.8 TimePicker 展示区

TimePicker 的核心展示区域包含组件本身和格式化时间的 Text:

Column() {
  Text('选择时间')
    .fontSize(12)
    .fontColor('#9999AA')
    .fontWeight(FontWeight.Bold)

  Column() {
    TimePicker({ selected: this.selectedDate })
      .useMilitaryTime(this.useMilitaryTime)
      .loop(true)
      .onChange((value: TimePickerResult) => {
        this.selectedHour = value.hour;
        this.selectedMinute = value.minute;
        this.selectedDate = new Date(2025, 0, 1, value.hour, value.minute);
      })

    Text(this.formatTime(this.selectedHour, this.selectedMinute))
      .fontSize(24)
      .fontColor('#1a1a2e')
      .fontWeight(FontWeight.Bold)
      .fontFamily('monospace')
      .margin({ top: 12 })
  }
  .width('100%')
  .padding({ top: Spacing.MD, bottom: Spacing.MD })
  .backgroundColor('#FFFFFF')
  .borderRadius(12)
  .justifyContent(FlexAlign.Center)
  .alignItems(HorizontalAlign.Center)
}

TimePicker 下方显示一个格式化后的时间预览,使用 monospace 等宽字体让数字对齐更美观。这个预览会随着 TimePicker 滚动和 12/24h 切换实时变化。

4.9 操作区域

Row() {
  Button('+ 添加闹钟')
    .fontSize(14)
    .fontColor('#FFFFFF')
    .backgroundColor('#1677FF')
    .borderRadius(8)
    .height(44)
    .layoutWeight(1)
    .onClick(() => { this.addAlarm(); })

  Blank().width(12)

  Column() {
    Text('24小时制')
      .fontSize(10)
      .fontColor('#9999AA')
      .margin({ bottom: 4 })
    Toggle({ type: ToggleType.Switch, isOn: this.useMilitaryTime })
      .selectedColor('#1677FF')
      .onChange((value: boolean) => { this.useMilitaryTime = value; })
  }
}

左侧是"添加闹钟"按钮(占据剩余空间),右侧是 24 小时制切换开关(固定宽度)。Toggle 使用 Switch 类型,.selectedColor('#1677FF') 设置激活态颜色。当 Toggle 状态改变时,所有已显示的时间格式和 TimePicker 显示都会同步切换。

4.10 闹钟列表

if (this.alarms.length > 0) {
  Column() {
    Row() {
      Text('闹钟列表')
        .fontSize(12).fontColor('#9999AA')
        .fontWeight(FontWeight.Bold).layoutWeight(1)
      Text(`${this.enabledCount} 个已启用`)
        .fontSize(11).fontColor('#9999AA')
    }

    Column() {
      ForEach(this.alarms, (alarm: AlarmItem, idx: number) => {
        Column() {
          Row() {
            Column() {
              Text(alarm.label)
                .fontSize(15)
                .fontColor(alarm.enabled ? '#1a1a2e' : '#BBBBCC')
                .fontWeight(FontWeight.Bold)
              Text(this.formatTime(alarm.hour, alarm.minute))
                .fontSize(24)
                .fontColor(alarm.enabled ? '#1a1a2e' : '#BBBBCC')
                .fontWeight(FontWeight.Bold)
                .fontFamily('monospace')
            }
            .alignItems(HorizontalAlign.Start)
            .layoutWeight(1)

            Toggle({ type: ToggleType.Switch, isOn: alarm.enabled })
              .selectedColor('#1677FF')
              .onChange(() => { this.toggleAlarm(alarm.id); })

            Text('🗑')
              .fontSize(16)
              .onClick(() => { this.deleteAlarm(alarm.id); })
          }
        }

        if (idx < this.alarms.length - 1) {
          Divider().strokeWidth(0.5).color('#F2F3F5')
        }
      })
    }
  }
}

每条闹钟显示:标签 + 时间 + 启用/禁用开关 + 删除按钮。禁用状态的闹钟文字颜色变灰(#BBBBCC),视觉上与启用闹钟(#1a1a2e)区分。相邻闹钟之间用 Divider 分隔,最后一条不显示分隔线。

4.11 空状态

if (this.alarms.length === 0) {
  Column() {
    Text('🔕')
      .fontSize(48)
      .margin({ bottom: 12 })
    Text('还没有闹钟')
      .fontSize(15)
      .fontColor('#9999AA')
      .fontWeight(FontWeight.Medium)
    Text('选择时间后点击"添加闹钟"')
      .fontSize(12)
      .fontColor('#BBBBCC')
      .margin({ top: 4 })
  }
  .width('100%')
  .padding({ top: 40, bottom: 40 })
  .backgroundColor('#FFFFFF')
  .borderRadius(BorderRadius.LG)
}

alarms 数组为空时,显示引导性的空状态提示,包含静音图标、标题文字和操作指引。这个设计让用户在没有闹钟时也知道下一步该做什么,而不是面对一个空白页面。

五、关键技术点详解

5.1 TimePickerResult 的 hour 属性

TimePickerResult.hour 始终返回 0-23 的小时数,不受 12/24 小时制显示模式的影响。这意味着:

// 即使用户在 12 小时制下选择 "下午 3:00"
// value.hour 的值仍然是 15,而不是 3
.onChange((value: TimePickerResult) => {
  this.selectedHour = value.hour;  // 始终 0-23
})

这个设计保证了数据层的一致性——无论 UI 如何展示,底层存储的时间数据都是 24 小时制的小时数。格式化显示时,我们使用 formatTime() 方法根据 useMilitaryTime 状态转换。

5.2 selected Date 对象的双向绑定

TimePicker 的 selected 参数接受一个 Date 对象。但 TimePicker 只使用 Date 中的小时和分钟字段,年、月、日会被忽略。在 onChange 回调中,我们更新 selectedDate 以同步状态:

this.selectedDate = new Date(2025, 0, 1, value.hour, value.minute);

这里的关键是:必须创建一个新的 Date 对象,而不是修改原对象的属性。这是因为 @State 的不可变更新机制——只有当对象引用发生变化时,ArkUI 才会检测到状态变更并触发 UI 刷新。

5.3 useMilitaryTime 的 UI 影响范围

.useMilitaryTime() 只影响 TimePicker 自身的显示,不影响 onChange 回调中的值。当切换 12/24 小时制时:

  • TimePicker 内部的滚轮会自动切换显示格式
  • formatTime() 方法同步切换格式化输出
  • 闹钟列表中的时间文字通过 formatTime() 同步更新
  • AlarmItem 中存储的 hour 始终是 0-23 的原始值

5.4 loop 循环滚动的边界处理

.loop(true) 启用后,TimePicker 的滚轮变成"无限"模式。在闹钟设置场景中,循环滚动带来了更好的用户体验:用户从 00:00 向上滚可以直接到 23:59,而无需反向滚动一大段距离。

如果禁用循环(.loop(false)),滚轮到达边界值(00:00 或 23:59)时会停止,用户需要反向滚动。适合需要强调时间先后顺序的场景(如预约系统中的开始/结束时间选择)。

5.5 @State 数组的不可变更新

ArkTS 的 @State 装饰器通过引用比较来判断数据是否变化。直接修改数组元素不会触发 UI 更新:

// ❌ 错误:直接修改不会被检测到
this.alarms.push(newAlarm);
this.alarms[0].enabled = false;

// ✅ 正确:创建新数组/新对象
this.alarms = this.alarms.concat([newAlarm]);
this.alarms = this.alarms.map(a => a.id === id ?
  { id: a.id, hour: a.hour, minute: a.minute, enabled: !a.enabled, label: a.label } as AlarmItem
  : a);

在 TimePicker 的 onChange 回调中,我们也遵循了同样的原则——创建新的 Date 对象而非修改原对象。

5.6 format 参数(已废弃)与 useMilitaryTime 的区别

在 API 10 之前,TimePicker 通过构造函数中的 format 参数控制 12/24 小时制:

// API 10 之前的写法(已废弃,不推荐)
TimePicker({
  selected: this.selectedDate,
  format: TimePickerFormat.HOUR_MINUTE  // 或 HOUR_MINUTE_SECOND
})

// API 11+ 的推荐写法
TimePicker({ selected: this.selectedDate })
  .useMilitaryTime(true)  // 24 小时制

迁移要点:format 控制显示精度(是否显示秒),useMilitaryTime 仅控制 12/24 小时制。API 11+ 中 TimePicker 默认精确到分钟,如需显示秒需使用 TimePickerFormat.HOUR_MINUTE_SECOND

六、运行效果

6.1 初始状态

页面顶部显示标题栏"闹钟设置",下方是组件介绍卡片。紧接着是 TimePicker 展示区,默认选中 07:30(24 小时制),下方显示蓝色大号等宽字体时间预览。然后是"添加闹钟"按钮(蓝色)和"24 小时制"Toggle(开启状态)。下方显示空状态提示"还没有闹钟"。

6.2 选择时间并添加闹钟

滚动 TimePicker 的滚轮,选择想要的小时和分钟。下方的格式化时间预览会实时更新。点击"+ 添加闹钟"按钮,闹钟列表出现,第一条闹钟标签为"起床",显示选择的时间,Toggle 默认启用。

6.3 多个闹钟管理

连续添加多条闹钟,标签自动循环为"上班"“午休”"运动"等。列表头部显示"X 个已启用"计数。点击某条闹钟的 Toggle 可以将其禁用,禁用的闹钟文字变灰,计数自动减少。点击垃圾桶按钮可以删除该闹钟。

6.4 切换 12 小时制

关闭"24 小时制"Toggle,TimePicker 显示模式切换为 12 小时制(上午/下午 + 1-12 小时),下方的格式化时间预览和闹钟列表中的时间都从 07:30 变为 上午 7:30。切换回 24 小时制后,所有时间恢复 HH:mm 格式。

七、最佳实践与注意事项

7.1 何时使用 TimePicker

  • 闹钟/定时器设置:用户需要选择特定的时间点,适合使用 TimePicker 滚轮选择
  • 预约/日程安排:选择会议开始时间、预约上门时间等
  • 提醒/通知设置:设置每日提醒时间
  • 作息设置:睡眠时间、起床时间等

7.2 何时使用自建方案

  • 需要秒级精度:TimePicker 默认只显示到分钟,如需秒级精度需使用 TimePickerFormat.HOUR_MINUTE_SECOND
  • 需要自定义 UI:如时钟表盘式的时间选择、圆弧拖动式等
  • 需要时间段选择:如"运行时段 08:00-20:00",需要两个时间点作为区间

7.3 常见问题

Q: TimePicker 选中后如何获取选中的小时和分钟?

A: 通过 onChange 回调获取 TimePickerResult,其中的 hour(0-23)和 minute(0-59)即为选中的时间值。

Q: 如何在 12 小时制下正确显示时间?

A: TimePickerResult.hour 始终是 0-23 的数值,不会因为显示模式而改变。需要在代码中自己实现转换逻辑:ampm = hour >= 12 ? '下午' : '上午'h12 = hour % 12 || 12

Q: TimePicker 可以和 TextClock 配合使用吗?

A: 当然可以。TimePicker 用于选择时间,TextClock 用于显示当前系统时间。在我们的闹钟 Demo 中,可以添加 TextClock 显示实时时间作为对照,让用户看到"现在时间"和"闹钟时间"的对比。

Q: start/end 参数在哪些 API 版本可用?

A: startend 参数从 API 24(HarmonyOS NEXT)开始可用。在 API 23 及之前版本,无法通过组件参数直接限制时间范围,需要自行在 onChange 回调中校验。

7.4 性能建议

  • 闹钟列表使用 ForEach 渲染,ArkUI 会自动处理增量更新,无需手动优化
  • 删除和状态切换操作使用 filter/map 创建新数组,时间复杂度 O(n),对于管理几十条闹钟的规模完全足够
  • TimePicker 的 onChange 回调在用户滚动时频繁触发,回调中应避免耗时操作(如网络请求、大数据量计算)

八、拓展思考

8.1 闹钟的持久化存储

本 Demo 的闹钟数据存储在 @State 中,App 退出后数据丢失。实际闹钟应用中,需要将闹钟数据持久化到本地。HarmonyOS 提供了多种本地存储方案:

  • Preferences:轻量级键值对存储,适合存储简单的闹钟配置
  • RelationalStore:关系型数据库,适合大量数据的结构化存储
  • BackgroundTaskManager:后台任务管理,用于闹钟到期时触发提醒

8.2 与其他时间组件配合

TimePicker 不是孤立的时间组件。在 ArkUI 中,多个时间相关组件可以协同工作:

  • TimePicker + TextClock:选择闹钟时间 + 显示当前时间对照
  • TimePicker + TextTimer:选择倒计时目标时间 + 显示剩余时间
  • TimePicker + DatePicker:选择完整的日期时间(如预约系统的"2025 年 3 月 15 日 下午 2:30")
  • TimePicker + TextInput:支持手动输入时间 + 滚轮选择两种方式

8.3 实际闹钟应用的表单校验

在真实闹钟应用中,除了本 Demo 的功能外,还需要考虑:

  • 重复规则:每天、工作日、周末、自定义(周一/周三/周五)
  • 闹钟铃声:从系统铃声库中选择
  • 振动模式:是否振动、振动强度
  • 贪睡设置:贪睡间隔、最多贪睡次数
  • 标签输入:支持用户自定义标签而非固定的预设标签

这些功能的实现可以让 TimePicker Demo 逐步演变成一个完整可用的闹钟应用。

九、总结

本文通过一个闹钟设置的实战 Demo,深入讲解了 HarmonyOS TimePicker 时间选择器组件的核心用法。主要涵盖以下知识点:

  1. TimePicker 构造函数selected 参数绑定 Date 对象,TimePicker 只使用其中的小时和分钟
  2. useMilitaryTime():控制 12/24 小时制显示,切换时 TimePicker 自动重绘
  3. loop():启用循环滚动,提升边界值之间的切换体验
  4. onChange 回调:参数类型 TimePickerResulthour 始终返回 0-23 的数值
  5. @State 不可变更新:使用 concat()/filter()/map() 创建新数组,显式构造新对象属性
  6. 时间格式化:根据 useMilitaryTime 动态格式化 12h 或 24h 显示字符串

TimePicker 是 ArkUI 时间选择场景的标准解决方案。从闹钟设置到预约系统,从提醒时间到作息管理,TimePicker 以其简洁的 API 和稳定的交互体验,帮助开发者快速实现时间选择功能。希望本文能帮助你在实际项目中高效运用 TimePicker 组件。


相关文章


本文基于 HarmonyOS NEXT API 24 编写,代码经 DevEco Studio 6.1.1 编译验证通过。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐